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、 (*)多对多中还可以为中间表建立一个实体方式映射。当然如果中间关系表还想有其他字
段,则要必须为中间表建立实体类(中间表和两个表之间就是两个一对多的关系了)。
EF Fluent API的更多相关文章
- EF Fluent API上
什么是Fluent API? 官方答案:EF 中内嵌的约定将 POCO 类映射到表.但是,有时您无法或不想遵守这些约定,需要将实体映射到约定指示外的其他对象,所以Fluent API和注解都是一种方 ...
- Repository模式--采用EF Fluent API使用EntityTypeConfiguration分文件配置Model映射关系
EF中类EntityTypeConfiguration是一个很有用的类,在nopCommerence中就使用这个类来分文件分文件配置Model映射关系.今天我就来谈谈Repository模式在Enti ...
- EF fluent API如何配置主键不自动增长
在Dbcontext中作如下添加: protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilde ...
- EF Core Fluent API
多对多配置 先安装 Install-Package MySql.Data.EntityFrameworkCore 创建3个表 创建类 public class Role { public long I ...
- 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 ...
- 使用 Fluent API 配置/映射属性和类型(摘自微软Data Access and Storage)
使用 Fluent API 配置/映射属性和类型 使用实体框架 Code First 时,默认行为是使用一组 EF 中内嵌的约定将 POCO 类映射到表.但是,有时您无法或不想遵守这些约定,需要将实体 ...
- 使用 Fluent API 配置/映射属性和类型
使用 Fluent API 配置/映射属性和类型 使用实体框架 Code First 时,默认行为是使用一组 EF 中内嵌的约定将 POCO 类映射到表.但是,有时您无法或不想遵守这些约定,需要将实体 ...
- 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...
- EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射
I.EF里的默认映射 上篇文章演示的通过定义实体类就可以自动生成数据库,并且EF自动设置了数据库的主键.外键以及表名和字段的类型等,这就是EF里的默认映射.具体分为: 数据库映射:Code First ...
随机推荐
- Python3-初识面向对象
知识点: 面向过程VS面向对象 初识类和对象 对象之间的交互 类与对象之间的命名空间 面向对象的组合用法 面向对象的三大特性(封装.继承.多态) 继承 抽象类和接口类 多态 封装 -- (prope ...
- NMON使用以及nmon_analyse生成分析报表
在我们监控我们的操作系统的时候如果可以把各个硬件的监控信息生成形象化的分析报表图对于我们来说是件太好的事情了,而通过ibm的nom和nmon_analyser两者的结合完全可以实现我们的要求.首先对n ...
- requests库入门04-http基本认证
因为后续样例中GitHub都需要提供认证,所以先写关于基本认证的 http的请求中,有一些请求是需要通过授权认证之后才会响应,授权认证就是检查用户名和密码的过程.http有一个基本认证方式,在认证的过 ...
- Centos 6.x/7.x yum安装php5.6.X(最新版)
鉴于Centos 默认yum源的php版本太低了,手动编译安装又有点一些麻烦,那么如何采用Yum安装的方案安装最新版呢.那么,今天我们就来学习下如何用yum安装php最新版. 1.检查当前安装的PHP ...
- CAN总线相关的几个gitlab代码
https://github.com/brtiberio/ATV71_CANopen.git https://github.com/linux-can/can-utils.git https://gi ...
- ubuntu html5开发工具brackets
Brackets 是一款使用 HTML,CSS,JavaScript 创建的开源的针对 Web 开发的编辑器.实时预览,快速编辑,跨平台,可扩展,开源,让 Brackets 成为一款非常优秀的编辑器. ...
- gstreamer
Abstract Ogg Vorbis is a completely open, patent-free, professional audio encoding and streaming tec ...
- JS中的进制转换
1 前言 js的进制转换, 分为2进制,8进制,10进制,16进制之间的相互转换, 我们直接利用 对象.toString()即可实现. 仅作为记录. 2 代码 //10进制转为16进制 (10).to ...
- 腾讯云CVM之间配置免密钥登录
背景: 1客户A和B俩台主机之间需要实现免密钥登录,已绑定腾讯云申请的密钥对 系统:centos7.3 A:192.168.0.100 B:192.168.0.84 A主机的私钥文件:aaa B主机的 ...
- linux强制将数据写入磁盘,防止丢失内存的数据
sync命令文件系统管理 sync命令用于强制被改变的内容立刻写入磁盘,更新超块信息. 在Linux/Unix系统中,在文件或数据处理过程中一般先放到内存缓冲区中,等到适当的时候再写入磁盘, 以提高系 ...