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 ...
随机推荐
- 百度echarts样式开发
Echarts如何进行实例化 var a1 = null; a1= echarts.init(document.getElementById('a1')); a1.setOption({ color: ...
- nc替代技术方案
powershell $client = New-Object System.Net.Sockets.TCPClient('127.0.0.1',4444);$stream = $client.Get ...
- dubbo源码分析9——ServiceBean的afterPropertiesSet方法分析
ServiceBean的afterPropertiesSet方法是实现了InitializingBean,还是准备先做宏观分析,然后再做细致分析.下面先宏观分析: public void after ...
- Linux内存分配小结--malloc、brk、mmap【转】
转自:https://blog.csdn.net/gfgdsg/article/details/42709943 http://blog.163.com/xychenbaihu@yeah/blog/s ...
- python 指定日期图片文件删除
手机使用python操作图片文件 起因 前几天去国图拍了一本书,一本心理学方面的书,也许你问我为什么不去买一本,或者去网上找pdf. 其实吧,关于心理学方面的书可以说在市面上一抓就是一堆,至于拍这本书 ...
- JavaScript数组去重—ES6的两种方式
说明 JavaScript数组去重这个问题,经常出现在面试题中,以前也写过一篇数组去重的文章,(JavaScript 数组去重的多种方法原理详解)但感觉代码还是有点不够简单,今天和大家再说两种方法,代 ...
- 解决win10中chm内容显示为空白的问题
在win10中打开chm文件,一般会是这个效果,内容显示为空白: 解决这个问题的方法是,在打开chm文件时,会有个安全警告的询问对话框,如下: 将[打开此文件前总是询问(W)]复选框的勾去掉,就OK了 ...
- 一道并查集的(坑)题:关闭农场closing the farm
题目描述 in English: Farmer John and his cows are planning to leave town for a long vacation, and so FJ ...
- kafka组件makemirror处理跨机房业务的应用
业务背景:app分散在不同的idc厂商不同的地域,产生业务数据都向一个kafka中进行处理,这些数据比较分散,如果一时网络抖动或者其他因素,数据就丢失了app --> kafka --> ...
- Mysql按条件计数的几种方法
最近在给某网站的后台添加一系列的统计功能,遇到很多需要按条件计数的情况.尝试了几种方法,下面简要记录,供大家参考. 问题描述 为使讨论简单易懂,我将问题稍作简化,去掉诸多的背景. 从前有一个皇帝,他有 ...