本实验演示基于上个实验构建的模型类,通过 EF Core 对数据进行 CRUD。

任务

  1. 展示各个 Actor 的所有 Film

    1. DbSet 类可以通过 InClude 和 ThenInclude 方法加载相关数据

    2. Film 与 Actor 的关系是多对多,FilmActor 就是多对多关系表

  2. 在数据库里面新增一个 City

    1. Context 类有 Add 方法

    2. 操作完记得 SaveChanges

  3. 更新你刚才添加的 City

    1. Update 方法
  4. 删除你刚才添加的 City

    1. Delete 方法

注:在尝试运行下面的代码前,在 VS Code 中执行全文替换(Ctrl + Shift + H),将所有 sbyte 替换为 byte。

Task1:读取多表连接的数据

通过 Include 和 ThenInclude 将 Film、FilmActor 和 Actor 表连接起来,再读取数据。

  1. using System;
  2. using MyApp.Models;
  3. using System.Linq;
  4. using Microsoft.EntityFrameworkCore;
  5. namespace MyApp
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. var dbContext = new sakilaContext();
  12. var records = dbContext.Film.Include(f => f.FilmActor).ThenInclude(r => r.Actor).ToList();
  13. foreach (var record in records)
  14. {
  15. System.Console.WriteLine($"Film: {record.Title}");
  16. var counter = 1;
  17. foreach (var fa in record.FilmActor)
  18. {
  19. System.Console.WriteLine($"\t Actor {counter++}: {fa.Actor.FirstName} {fa.Actor.LastName}");
  20. }
  21. }
  22. }
  23. }
  24. }

输出如下:

  1. Film: ACADEMY DINOSAUR
  2. Actor 1: WARREN NOLTE
  3. Actor 2: MENA TEMPLE
  4. Actor 3: OPRAH KILMER
  5. Actor 4: ROCK DUKAKIS
  6. Actor 5: CHRISTIAN GABLE
  7. Actor 6: JOHNNY CAGE
  8. Actor 7: PENELOPE GUINESS
  9. Actor 8: SANDRA PECK
  10. Actor 9: MARY KEITEL
  11. Actor 10: LUCILLE TRACY
  12. ...
  13. Film: ZORRO ARK
  14. Actor 1: LISA MONROE
  15. Actor 2: IAN TANDY
  16. Actor 3: NICK DEGENERES

Task2:插入数据

  1. var dbContext = new sakilaContext();
  2. var city = new City() { CityId = 1001, Name = "Wonderland", CountryId = 109 };
  3. dbContext.Add(city);
  4. dbContext.SaveChanges();

注:

  • 你需要将 City 类自动生成的 City1 属性重命名为 Name

  • 虽然 city_id 列是自增的,你在插入 city 时也必须手动指定唯一的 ID

执行代码后,打开 MySQL Workbench 用 SELECT * FROM city WHERE city_id = 1001 去查看插入的 city。

Task3:更新数据

  1. var uTarget = dbContext.City.SingleOrDefault(c => c.CityId == 1001);
  2. if (uTarget != null)
  3. {
  4. uTarget.Name = "Kirkland";
  5. dbContext.Update(uTarget);
  6. dbContext.SaveChanges();
  7. }

Task4:删除数据

  1. var uTarget = dbContext.City.SingleOrDefault(c => c.CityId == 1001);
  2. if (uTarget != null)
  3. {
  4. dbContext.Remove(uTarget);
  5. dbContext.SaveChanges();
  6. }