EF Core 2数据库优先模式下多对多关联(链接表)问题咨询
解决EF Core脚手架生成多对多关联时生成中间表实体的问题
我太懂你这个困扰了——在EF6里处理多对多关联时,脚手架会自动把中间表(比如你的Projects_Models)隐藏起来,直接在Project和Model类里生成双向导航属性,用起来特别顺手;但EF Core的脚手架默认却会把中间表生成一个独立的ProjectsModel类,完全不是你想要的效果对吧?别慌,咱们手动调整几步就能让它和EF6的表现一致:
具体调整步骤
第一步:删除自动生成的中间表实体
直接删掉脚手架生成的ProjectsModel.cs文件,这个类咱们不需要。第二步:给两个主实体添加导航属性
修改Project.cs,添加指向Model集合的导航属性:public virtual ICollection<Model> Models { get; set; } = new List<Model>();再修改
Model.cs,添加指向Project集合的导航属性:public virtual ICollection<Project> Projects { get; set; } = new List<Project>();第三步:在DbContext中配置多对多关联
打开你的EFEntities.cs上下文类,重写OnModelCreating方法(如果已经存在就直接添加配置),指定多对多关联对应的中间表:protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置Projects和Models的多对多关联 modelBuilder.Entity<Project>() .HasMany(p => p.Models) .WithMany(m => m.Projects) .UsingEntity(j => j.ToTable("Projects_Models")); // 注意:保留脚手架自动生成的其他实体配置代码,别把原来的内容删掉! // 比如原来的modelBuilder.Entity<Project>(entity => { ... })这类代码要保留 }
额外说明
如果你的Projects_Models表只有两个外键字段(比如ProjectId和ModelId),没有其他额外数据(比如创建时间、操作人),EF Core 5.0及以上版本其实是支持自动识别这种无额外字段的多对多关联的,但脚手架工具偶尔还是会生成中间实体类,这时候按上面的步骤调整就好。
要是你的中间表包含额外字段,那确实需要保留中间实体类,这时候就得把关联改成Project与ProjectsModel一对多、Model与ProjectsModel一对多的形式来处理了。
内容的提问来源于stack exchange,提问作者Aximili
相关产品推荐
相关产品推荐

