EF Fluent API

EntityTypeConfiguration

它可以为一个实体类,配置一个模型。

196558-20181022185009744-716564451.png

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、 (*)多对多中还可以为中间表建立一个实体方式映射。当然如果中间关系表还想有其他字
段,则要必须为中间表建立实体类(中间表和两个表之间就是两个一对多的关系了)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值