EF Fluent API
EntityTypeConfiguration#
它可以为一个实体类,配置一个模型。
Entity Framework 6 一次加载许多个 Fluent API 映射#
如果对于许多实体有大量映射,则 OnModelCreating 中会有许多重复的 modelBuilder.Configurations.Add 方法。 为了从这种枯燥的工作中解放出来,您现在可以只用一个方法从给定程序集加载所有 EntityTypeConfiguration。 这里,我使用新的 AddFromAssembly 方法来加载在正在运行的应用程序的执行程序集中指定的配置:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();//移除复数表名的契约
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();//防止黑幕交易 要不然每次都要访问 EdmMetadata这个表
modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
}
代表从这句话所在的程序集,加载所有的继承自EntityTypeConfiguration为模型配置类。
这种方法的一个出色功能是,它不受将要加载的配置的范围限制。 甚至可以将自定义 EntityTypeConfiguration 类标记为私有,该方法会找到这些类。 此外,AddFromAssembly 也理解 EntityTypeConfiguration 中的继承层次结构。
一对多#
和关系映射相关的方法:
1) 基本套路this.Has****(p=>p.A).With***()
当前这个表和A属性的表的关系是Has定义,
With定义的是A对应的表和这个表的关系。Optional/Required/Many
2) HasOptional()
有一个可选的(可以为空的)
3) HasRequired()
有一个必须的(不能为空的)
4) HasMany()
有很多的
5) WithOptional()
可选的
6) WithRequired()
必须的
7) WithMany()
很多的
总结一对多、多对多的“最佳实践”#
一对多最佳方法(不配置一端的集合属性):#
1、 多端
public class Student
{
public long Id { get; set; }
public string Name { get; set; }
public long ClassId { get; set; }
public virtual Class Class { get; set; }
}
2、 一端
public class Class
{
public long Id { get; set; }
public string Name { get; set; }
}
3、 在多端的模型配置(StudentConfig)中:
this.HasRequired(e => e.Class).WithMany() .HasForeignKey(e=>e.ClassId);
一对多的配置(在一端配置一个集合属性,极端不推荐)#
1、多端
public class Student
{
public long Id { get; set; }
public string Name { get; set; }
public long ClassId { get; set; }
public virtual Class Class { get; set; }
}
2、 一端
public class Class
{
public long Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Student> Students { get; set; } = new List<Student>();
}
3、 多端的配置(StudentConfig)中
this.HasRequired(e => e.Class).WithMany(e=>e.Students).HasForeignKey(e=>e.ClassId);
//WithMany()的参数不能丢
多对多最佳配置#
1、 两端模型
public class Student
{
public long Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Teacher> Teachers { get; set; } = new List<Teacher>();
}
public class Teacher
{
public long Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Student> Students { get; set; } = new List<Student>();
}
2、 在其中一端配置(StudentConfig)
this.HasMany(e => e.Teachers).WithMany(e=>e.Students).Map(m => //不要忘了WithMany的参数
m.ToTable("T_StudentTeachers").MapLeftKey("StudentId").MapRightKey("TeacherId"));
4、 多对多中 移除关系:t.Students.Remove(t.Students.First()); 添加关系
5、 (*)多对多中还可以为中间表建立一个实体方式映射。当然如果中间关系表还想有其他字
段,则要必须为中间表建立实体类(中间表和两个表之间就是两个一对多的关系了)。
作者:【唐】三三
出处:https://www.cnblogs.com/tangge/p/9831957.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2016-10-22 .NET开发工具之Excel导出公共类
2016-10-22 (1)Underscore.js入门