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 国际」许可协议进行许可。

posted @   【唐】三三  阅读(1113)  评论(0编辑  收藏  举报
编辑推荐:
· 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入门
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示