最近迁移项目。发现有表结构是一对多关系。定位申请单对应多个制模。自己对这种关系不够熟悉,不敢乱改。现在补一下基础。
数据库表之间的关系:一对一、一对多、多对多(需要一张第三方表来记录)。
在EF core中:
1. 实体类中关系属性;
2. FluentAPI关系配置;
3. 使用关系操作。
1、迁移生成数据库表。
2、编写代码测试数据插入。
3、不需要显式为Comment对象的Article属性赋值(当前赋值也不会出错),也不需要显式地把新创建的Comment类型的对象添加到DbContext中。EF Core会“顺竿爬”。
Article a1 = new Article();
a1.Title = "微软发布.NET 6大版本的首个预览";
a1.Content = "微xxxx";
Comment c1 = new Comment() { Message="支持"};
Comment c2 = new Comment() { Message = "微软太牛了" };
Comment c3 = new Comment() { Message = "火钳刘明" };
a1.Comments.Add(c1);
a1.Comments.Add(c2);
a1.Comments.Add(c3);
using (TestDbContext ctx = new TestDbContext())
{
ctx.Articles.Add(a1);
// ctx.Comments.Add(c1) 不需要特意去操作comment 表了
await ctx.SaveChangesAsync();
}
个人理解:
一对多这样配置完,你只要操作 article 表,而不用特意去操作comment表。
换句话说:只要操作父对象。EF core会帮你自动的操作子对象
获取关系数据 使用 Include( ) 方法
Article a = ctx.Articles.Include(a=>a.Comments).Single(a=>a.Id==1);
Console.WriteLine(a.Title);
foreach(Comment c in a.Comments)
{
Console.WriteLine(c.Id+":"+c.Message);
}
// Include定义在Microsoft.EntityFrameworkCore命名空间中。
// 查看一下生成的SQL语句