EF 约定介绍
当前环境为EF Code First开发模式中
一、EF默认约定
1、常用约定
(1)、当没有显示指定实体主键的时候,EF会默认将长得最像Id的属性(且类型为GUID)设为主键
(2)、设计实体时,当一个实体包含一个集合属性,该集合属性里面的元素是另一个实体时,则默认未一对多关系,即使没有显示的指定一对多的关系,EF会默认的设置主外键(主从)关系
(3)、一对一的实体关系,需要手动设置主从关系
(4)、多对多无载荷关系实体,EF自动生成中间表,不需要新增实体来表示.
(5)、表名默认复数化
2、类型发现约定(Type Discovery)
使用EF开发,往往是以定义一些模型类开始,定义完这些模型类之后,需要让DbContext知道哪些类型包含在当前模型中,因此,我们需要自定义一个ZdyNameDbContext,并继承DbContext,并在自定义DbContext中暴露需要暴露的类型,这样在Code First开发模式中,就可以使用
context(数据库上下文),使用这些预先暴露的DbSet类型,具体的代码如下:
public class EFStudyDbContext:DbContext
{
//暴露City的DbSet类型的属性
public DbSet<City> Citys { get; set; } //暴露Town的DbSet类型的属性
public DbSet<Town> Towns { get; set; }
public EFStudyDbContext():base("name=EFStudyConnstrings") {} protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
}
3、主键约定(Primary Key Convention)
当没有显示指定实体主键的时候,EF会默认将长得最像Id的属性(且类型为GUID)设为主键,如果类中的属性(Property)名称为 ID (不区分大小写)或 ClassNameID(类名 + ID),Code First 则推断这个属性为主键。如果主键属性的类型为数字型或 GUID 则会被当成标识列(Identity Column)
4、关系(外键/导航属性)约定Relationship(Foreign Key/Navigation Properties) Convention
EF中,两个实体间的关系是通过导航属性的方式来实现,每一个对象都能拥有一个它所参与的关系的导航属性,导航属性提供了一种方式在两端来操作这个关系来获取我们需要的数据,可以返回任何一方的引用对象(对象间的关系是1:0或1:1),或者对象的集合(对象间的关系是1:*或*:*),Code First 能够根据导航属性定义的方式来推断实体间的关系.并映射到数据库表中.
除了导航属性规定实体间的关系外,外键属性来式规定实体间方式的一种手段.Code First能够推断以下的命名属性为外键(优先级从上到下):
(1)、导航属性名+关联实体的主键名
(2)、关联实体实体名+关联实体的主键名
(3)、关联实体的主键名
注:
(1)、当外键关系被检测到,Code First会根据外键的可空性来推断关系的具体形式;如果外键属性是可空的,那么关系会被设置为可选的,否则,关系就是必选的.
(2)、当关联实体的外键属性被设置为不为空,Code First会设置级联删除,反之不会。
5、复杂类型约定(Complex Types Conventions)
如果Code First无法从类型中推测出主键,也没有通过Data Annotations或者Fluent Api进行注册的主键,那么此类型将会被注册成为复杂类型Complex Type,Complex Types要求类型中不能包含有对其他类型的引用,并且其它类型中也不能包含对本类型的引用的集合.代码如下:
public class Order
{
public Guid Id { get; set; }
public Details Details { get; set; }
} public class Details
{
public System.DateTime Time { get; set; }
public string Location { get; set; }
public string Num { get; set; }
}
6、连接字符串约定(Connection String Conventions)
EF 数据库连接约定(Connection String Conventions in Code First)
二、移除约定
EF提供了移除默认约定的方法,通过该方法我们可以移除所有定义在System.Data.Entity.ModelConfiguration.Conventions namespace下的约定,例如,移出表名复数约定,代码如下:
public class SchoolEntities : DbContext
{
. . . protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Configure Code First to ignore PluralizingTableName convention
// If you keep this convention, the generated tables
// will have pluralized names.
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
三、自定义约定
最新文章
- AtomicInteger源码注释
- POI2005Bank notes银行货币
- Java abstract
- javascript双击事件取消默认的两次单击事件
- 使用escape编码地址栏中的中文字符
- yum update Transaction Check Error
- 一步一步制作yaffs/yaffs2根文件系统(三)---使用glibc库构造 /lib
- FxCop
- jquery ui dialog去除第一个文本框焦点问题
- JavaScript的“闭包”到底是什么
- S5PV210启动过程分析
- GET_DDL提取目标元数据:ddl
- LeetCode 上最难的链表算法题,没有之一!
- Linux学习之基本操作命令
- Oracle查看存储过程最后编辑时间
- oo 第一次博客作业
- UVA 1152 4 Values whose Sum is 0 (枚举+中途相遇法)(+Java版)(Java手撕快排+二分)
- Haskell语言学习笔记(38)Lens(1)
- Java多线程-线程的生命周期
- 常用class 总结
热门文章
- spark 写 hbase 数据库,遇到Will not attempt to authenticate using SASL (unknown error)
- php读取用友u8客户档案
- SqlCommand和SqlDataAdapter的区别
- C#中验证sql语句是否正确(不执行语句)
- 初探FFT(快速傅里叶变换)
- jquery ui widgets-datepicker
- 【Win10】实现 ListViewBase 平滑滚动
- ReactJS 官网案例分析
- .net core Ocelot Consul 实现API网关 服务注册 服务发现 负载均衡
- 接口interface和抽象类型abstract