public class Article { public int Id { get; set; } public string Title { get; set; } public string Message { get; set; } public List<Comment> Comments = new List<Comment> ();//实体类中关系属性 } public class Comment { public int Id { get; set; } public string Message { get; set; } public Article TheArticle { get; set; }//实体类中关系属性
}
2、FluentAPI关系配置
1 2 3 4 5 6 7 8 9 10 11
internal class CommentConfig : IEntityTypeConfiguration<Comment> { public void Configure(EntityTypeBuilder<Comment> builder) { builder.ToTable("T_Comments"); builder.HasOne<Article>(e => e.TheArticle).WithMany(e => e.Comments).IsRequired();//FluentAPI关系配置 } } public class ArticleConfig : IEntityTypeConfiguration<Article> { public void Configure(EntityTypeBuilder<Article> builder) { builder.ToTable("T_Articles"); } }
EF Core会在数据表中建外键列,如果需要获取外键列的值,就需要做关联查询,效率低,因而需要一种不需要Join直接获取外键列的值的方法。 比如: 我就想获取评论对应文章的Id,但是我用了Include就会创建一个Join连接的Sql语句,这样没有必要。 解决方法: 1、在实体类中显示声明一个外键属性 2、关系配置中通过HasForeignKey(c=>c.ArticleId)显式指定该属性为外键。 3、除非必要,否则不用声明,因为会引入重复
1 2 3 4 5 6 7
public class Comment { public int Id { get; set; } public string Message { get; set; } public Article TheArticle { get; set; }//实体类中关系属性 public int TheArticleId { get; set; }//显式指定外键
public class Leave { public long Id { get; set; } public DateTime Time { get; set; } public User Requester { get; set; }//申请人 public User Approver1 { get; set; }//审批人1 public User Approver2 { get; set; }//审批人2 public User Approver3 { get; set; }//审批人3 public string Remarks { get; set; } } public class User { public long Id { get; set; } public string Name { get; set; } }
配置类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
public class UserConfig : IEntityTypeConfiguration<User> { public void Configure(EntityTypeBuilder<User> builder) { builder.ToTable("T_Users"); } } public class LeaveConfig : IEntityTypeConfiguration<Leave> { public void Configure(EntityTypeBuilder<Leave> builder) { builder.ToTable("T_Leaves"); builder.HasOne<User>(l=>l.Requester).WithMany().IsRequired(); builder.HasOne<User>(l=>l.Approver1).WithMany(); builder.HasOne<User>(l => l.Approver2).WithMany(); builder.HasOne<User>(l => l.Approver3).WithMany(); } }
Program.cs:
1 2 3 4 5 6 7 8 9 10 11 12 13
static void Main(string[] args) { using(var ctx = new MyDbContext()) { var zs = new User { Name = "张三" }; var ls = new User { Name = "李四" }; var ww = new User { Name = "王五" }; ctx.Users.Add(zs); ctx.Users.Add(ls); ctx.Users.Add(ww); ctx.Leaves.Add(new Leave { Requester=zs,Approver1 = ls,Approver2=ww,Remarks="看牙",Time = DateTime.Now,Approver3=ww}); ctx.SaveChanges(); } } }
public class OrgUnit { public long Id { get; set; } public string Name { get; set; } public OrgUnit? Parent { get; set; } public List<OrgUnit> Children { get; set; } = new List<OrgUnit>(); }
配置类:
1 2 3 4 5 6 7
public class OrgUnitConfig : IEntityTypeConfiguration<OrgUnit> { public void Configure(EntityTypeBuilder<OrgUnit> builder) { builder.ToTable("T_OrgUnits"); builder.Property(o=>o.Name).IsUnicode().IsRequired().HasMaxLength(50); builder.HasOne<OrgUnit>(o => o.Parent).WithMany(o => o.Children);//根节点没有Parent所以这个关系不能为不可空 } }
Program.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
static void Main(string[] args) { var orgUnit1 = new OrgUnit { Name = "秋华集团全球总部" }; var orgUnit11 = new OrgUnit { Name = "秋华集团亚太总部", Parent = orgUnit1 }; var orgUnit12 = new OrgUnit { Name = "秋华集团美洲总部", Parent = orgUnit1 }; var orgUnit111 = new OrgUnit { Name = "秋华集团(中国)", Parent = orgUnit11 }; var orgUnit112 = new OrgUnit { Name = "秋华集团(新加坡)", Parent = orgUnit11 }; var orgUnit121 = new OrgUnit { Name = "秋华集团(美国)", Parent = orgUnit12 }; var orgUnit122 = new OrgUnit { Name = "秋华集团(加拿大)", Parent = orgUnit12 }; using (var ctx = new MyDbContext()) { ctx.OrgUnits.Add(orgUnit1); ctx.OrgUnits.Add(orgUnit11); ctx.OrgUnits.Add(orgUnit12); ctx.OrgUnits.Add(orgUnit111); ctx.OrgUnits.Add(orgUnit112); ctx.OrgUnits.Add(orgUnit121); ctx.OrgUnits.Add(orgUnit122); ctx.SaveChanges(); } }