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、 (*)多对多中还可以为中间表建立一个实体方式映射。当然如果中间关系表还想有其他字

段,则要必须为中间表建立实体类(中间表和两个表之间就是两个一对多的关系了)。

EF Fluent API的更多相关文章

  1. EF Fluent API上

     什么是Fluent API? 官方答案:EF 中内嵌的约定将 POCO 类映射到表.但是,有时您无法或不想遵守这些约定,需要将实体映射到约定指示外的其他对象,所以Fluent API和注解都是一种方 ...

  2. Repository模式--采用EF Fluent API使用EntityTypeConfiguration分文件配置Model映射关系

    EF中类EntityTypeConfiguration是一个很有用的类,在nopCommerence中就使用这个类来分文件分文件配置Model映射关系.今天我就来谈谈Repository模式在Enti ...

  3. EF fluent API如何配置主键不自动增长

    在Dbcontext中作如下添加: protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilde ...

  4. EF Core Fluent API

    多对多配置 先安装 Install-Package MySql.Data.EntityFrameworkCore 创建3个表 创建类 public class Role { public long I ...

  5. 10.翻译系列:EF 6中的Fluent API配置【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/fluent-api-in-code-first.aspx EF 6 Code-Firs ...

  6. 使用 Fluent API 配置/映射属性和类型(摘自微软Data Access and Storage)

    使用 Fluent API 配置/映射属性和类型 使用实体框架 Code First 时,默认行为是使用一组 EF 中内嵌的约定将 POCO 类映射到表.但是,有时您无法或不想遵守这些约定,需要将实体 ...

  7. 使用 Fluent API 配置/映射属性和类型

    使用 Fluent API 配置/映射属性和类型 使用实体框架 Code First 时,默认行为是使用一组 EF 中内嵌的约定将 POCO 类映射到表.但是,有时您无法或不想遵守这些约定,需要将实体 ...

  8. 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...

  9. EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射

    I.EF里的默认映射 上篇文章演示的通过定义实体类就可以自动生成数据库,并且EF自动设置了数据库的主键.外键以及表名和字段的类型等,这就是EF里的默认映射.具体分为: 数据库映射:Code First ...

随机推荐

  1. C++虚函数总结

    为什么使用虚函数?什么是虚函数?虚函数是为了解决什么问题? 面向对象的三大特征: 封装 多态 继承 普通虚函数 虚析构函数 纯虚函数 抽象类 接口类 隐藏 vs 覆盖 隐藏与覆盖之间的关系 早绑定和晚 ...

  2. 【VMware vSphere】vCenter添加主机失败:无法访问指定主机

    背景 前一段时间,给一台服务器安装ESXi系统,安装成功之后,通过vCenter在上面安装了一台VDP系统.结果前几天发现服务器掉线,重新连接时出现问题.问题描述如下: 其中错误堆栈具体内容为:在 v ...

  3. Python3-操作系统发展史

    操作系统发展史 手工操作 —— 穿孔卡片 批处理 —— 磁带存储 多道程序系统 操作系统的作用 手工操作 —— 穿孔卡片 1946年第一台计算机诞生--20世纪50年代中期,计算机工作还在采用手工操作 ...

  4. python 大全

    python 大全:https://awesome-python.com/ 生产 GUI 应用的库 :PyQt ,PySide , 不错   (https://kivy.org)kivy - A li ...

  5. 古董VS2002安装

    在2002 年,随着 .NET 口号的提出与 Windows XP/Office XP 的发布,微软发布了 Visual Studio .NET(内部版本号为 7.0). 使用VS2002+Objec ...

  6. 【翻译】Chemkin - Chapter 1

    [这段文字是2013年3月翻译的,整理老文档时发现就拿出来,提醒我们:任何试图翻译英文手册的尝试都是徒劳的] 第一章   介绍 Chemkin理论手册提供了一个对关系和公式的宽泛的概览,这些关系和公式 ...

  7. JUnit3 和 JUnit4的区别

    JUnit3 和 JUnit4的区别 1.JUnit 4使用org.junit.*包而JUnit 3.8使用的是junit.Framework.*;为了向后兼容,JUnit4发行版中加入了这两种包. ...

  8. apache配置文件语法错误命令:httpd -t

    cmd命令行切换到C:\wamp\bin\apache\apache2.4.9\bin目录 输入httpd -t命令 错误如下: 1.Syntax error on line 92 of C:/Apa ...

  9. Ubuntu选择软件源

    1. 系统桌面右上角,系统菜单中选择Software Up to Date 2. 点击Settings-按钮 3. Ubuntu Software标签页,Download from选择中国的软件服务器 ...

  10. importlib模块

    importlib模块 import importlib根据这个字符串来导入这个模块的 a=importlib.import_module('xx.oo')print(a.Person())里面可以传 ...