Code First使你能够通过C# 或者 Visual Basic .NET来描述模型,模型的基本规则通过使用约定来进行检查,而约定就是一系列内置的规则。

在Code First中基于类的定义通过一系列的规则约定自动配置概念模型,约定被定义在命名空间System.Data.Entity.ModelConfiguration.Conventions中。

你可以进一步配置你的模型通过数据注解或者fluent API。

优先通过 fluent API配置紧随其后的是数据注解约定。更多信息可以查看Data Annotations, Fluent API - Relationships, Fluent API - Types & Properties and Fluent API with VB.NET.

关于Code First的一系列约定可以参考API Documentation.这篇文章的主题主要阐述了Code First的约定。

类型探索

当我们使用Code First开发的时候,通过写.NET Framework类来定义概念(领域)模型,除了定义类之外,你还需要让DbContext知道哪些类型是你想要代表的模型。因此,你需要定义一个上下文类继承自DbContext,用DbSet修饰你需要表示为模型的类型。Code First将包含这些类型并获取这个引用类型,即使引用来下被定义在不同的程序集当中。

如果你的类在继承结构体系当中,这些类在同一个程序集下面时,你将基类定义成一个DbSet属性就足够了,它将自动推断出所包含的其它相关联的类型。

public class SchoolEntities : DbContext
{
public DbSet<Department> Departments { get; set; }
}
public class Department
{
// Primary key
public int DepartmentID { get; set; }
public string Name { get; set; } // Navigation property
public virtual ICollection<Course> Courses { get; set; }
}
public class Course
{
// Primary key
public int CourseID { get; set; } public string Title { get; set; }
public int Credits { get; set; } // Foreign key
public int DepartmentID { get; set; } // Navigation properties
public virtual Department Department { get; set; }
}
public partial class OnlineCourse : Course
{
public string URL { get; set; }
}
public partial class OnsiteCourse : Course
{
public string Location { get; set; }
public string Days { get; set; }
public System.DateTime Time { get; set; }
}

如果你不想让某一个类型作为模型类,你可以使用 NotMapped 属性或者使用 fluent API的DbModelBuilder.Ignore.

modelBuilder.Ignore<Department>();

主键约定

如果在类中存在名为"ID"(不区分大小写)的属性或者是类名+"ID",Code First将自动推断这个属性作为主键。

public class Department
{
// Primary key
public int DepartmentID { get; set; }
. . .
}

关系约定

在 Entity Framework中,导航属性提供两个实体类型之间的跳转,导航属性允许你从两个方向导航和管理关系,它返回一个引用对象(1个或者0个)或者一个集合(多个对象列表)。Code First 是基于导航属性来推断类型直接的关系的。

除了导航属性之外,建议你添加一个外键属性去表示对象直接的依赖关系。

遵循以下格式将表示一个外键的关系:<导航属性名称><被导航实体的主键名称>,<被导航实体的类名称><被导航实体的主键名称>,或者<被导航实体的主键名称>,如果找到了多个这样的匹配关系,将按照上面所给出的先后顺序来推断。外键检测是不区分大小写的。

当检测到一个外键属性, Code First基于可空的外键推断出关系。如果属性是可空的表示这个关系是可选的,否则这个关系将是必须注册的。

如果外键依赖的实体是不可空的, Code First 将设置级联删除的关系。如果外键依赖的实体是可空的,Code First将不设置级联删除关系,当引用的实体删除时,外键将被设置为null。更加多样的级联删除我们可以通过使用fluent API.来重新设置约定。

在如下的例子中导航属性和外键将被用于定义Department 和Course 类之间的关系。

public class Department
{
// Primary key
public int DepartmentID { get; set; }
public string Name { get; set; } // Navigation property
public virtual ICollection<Course> Courses { get; set; }
}
public class Course
{
// Primary key
public int CourseID { get; set; } public string Title { get; set; }
public int Credits { get; set; } // Foreign key
public int DepartmentID { get; set; } // Navigation properties
public virtual Department Department { get; set; }
}

注意:如果存在多个相同类型之间的关系(比如,假设你定义了Person and Book类,Person 类包含了 ReviewedBooks and AuthoredBooks这两个导航属性,同时Book类又包含了 Author and Reviewer导航属性 )你需要手动的通过Data Annotations 或者 the fluent API来配置关系。更多信息,请参考 Data Annotations - RelationshipsFluent API - Relationships.

复制类型约定

当Code First发现一个类的主键无法推测, 并且没有通过data annotations 或者fluent API来标识,那么这个类型将自动被当成一个复杂类型来处理,复杂类型要求它不存在引用其他实体类型的属性。

下面的类Details 将被当成复杂类型,因为它没有设置主键

public partial class OnsiteCourse : Course
{
public OnsiteCourse()
{
Details = new Details();
} public Details Details { get; set; }
} public class Details
{
public System.DateTime Time { get; set; }
public string Location { get; set; }
public string Days { get; set; }
}

连接字符串约定

学习更多关于 DbContext连接的约定可以查看 Connections and Models.

移除约定

在命名空间System.Data.Entity.ModelConfiguration.Conventions中,你可以移除约定,以下例子将移除PluralizingTableNameConvention.

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>();
}
}

自定义约定

自定义约定在EF6开始支持,更多信息请查看 Custom Code First Conventions.

老外的文章真的是写得非常精彩,所以我强烈建议大家去看英文技术博客和文章,看不懂就硬着头皮看,久了自然就看得懂了,一开始即使看不懂文字说明,看看代码也好呀。

由于本人英文实在太烂,所以如果有翻译得不通顺的地方还忘见谅,大家可以参考原文,原文地址:Entity Framework Code First Conventions

Entity Framework Code First约定的更多相关文章

  1. Entity Framework Code First属性映射约定

    Entity Framework Code First与数据表之间的映射方式有两种实现:Data Annotation和Fluent API.本文中采用创建Product类为例来说明tity Fram ...

  2. Entity Framework Code First关系映射约定

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

  3. Entity Framework Code First主外键关系映射约定

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

  4. Entity Framework Code First关系映射约定【l转发】

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

  5. 补习知识:Entity Framework Code First属性映射约定

    Entity Framework Code First与数据表之间的映射方式有两种实现:Data Annotation和Fluent API.本文中采用创建Product类为例来说明tity Fram ...

  6. Entity Framework Code First属性映射约定 转载https://www.cnblogs.com/libingql/p/3352058.html

    Entity Framework Code First属性映射约定   Entity Framework Code First与数据表之间的映射方式有两种实现:Data Annotation和Flue ...

  7. Entity Framework Code First学习系列目录

    Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity Framework 5.0+MS SQL Server 2012, ...

  8. Entity Framework Code First (三)Data Annotations

    Entity Framework Code First 利用一种被称为约定(Conventions)优于配置(Configuration)的编程模式允许你使用自己的 domain classes 来表 ...

  9. Entity Framework Code First (二)Custom Conventions

    ---------------------------------------------------------------------------------------------------- ...

随机推荐

  1. Intent的概念及应用(一)

    ------siwuxie095 1.显式Intent (1)先创建一个项目:LearnIntent,选择API:21 Android 5.0, 选择Empty Activity,完成 (2)创建一个 ...

  2. iOS UICollectionView 长按移动cell

    ref:http://www.jianshu.com/p/31d07bf32d62 iOS 9之后: 示例如下 效果 前言: 看完你可以学到哪些呢? 就是文章标题那么多, 只有那么多. . 手残效果图 ...

  3. 在GitHub上创建上传下载开源项目代码

    1.注册GitHub帐号,创建GitHub项目代码仓库 1.1.注册GitHub帐号 在使GitHub之前,需要先登录其官网注册一个免费使用的账号.登录 https://github.com/join ...

  4. cocos2d-x介绍

    总体来说,cocos2d-x是一个优秀的库. Cocos2d-x没有很复杂的一个架构,基本上是一些以单件形式提供的管理器和是一些围绕SceneGraph(CCNode及其派生类)展开的类.这个设计使得 ...

  5. 学习tabhost 实现微博的主界面

    2014-05-27 吴文付 微博的主界面还是很漂亮的,我们这里来熟悉下tabhost的使用, 网上资料很多,主要参考了:http://blog.csdn.net/shulianghan/articl ...

  6. 饼干是这样压缩的——PHP使用zlib扩展实现页面GZIP压缩输出

    饼干是这样压缩的——PHP使用zlib扩展实现页面GZIP压缩输出 GZIP(GNU-ZIP)是一种压缩技术.经过GZIP压缩后页面大小可以变为原来的30%甚至更小.这样用户浏览的时候就会感觉很爽很愉 ...

  7. 解析xml的问题未解决

    工作上需要解析xml,目前的逻辑是:解析xml到对象中,然后对象再插入数据库.但这存在内存溢出的风险. 今天做的另外一件事是将循环用到工作上,暂时还没有测试,是否能保证程序的重启.有待观察 ##### ...

  8. ubuntu 15.10安装搜狗输入法不能打开

    安装Linux是为了更好的做开发,而开发其实不需要输入中文的,然而 在大中国的环境下,电脑没有中文输入法是不行的... 这次装ubuntu 坚持了4天没有中文输入法,我能说,其实没有中文输入法貌似也没 ...

  9. Delphi基本图像处理方法汇总

    这篇文章主要介绍了Delphi基本图像处理方法,实例汇总了Delphi操作图像实现浮雕.反色.模糊.翻转等常用效果的方法,非常具有实用价值,需要的朋友可以参考下   本文实例汇总了Delphi基本图像 ...

  10. origin中把多个拟合曲线放在一张图

    双击其中一个.或者New一个graph.这里直接双击其中一个图. 右键,找到layer contents. 可以看到,一个scatter配一个polynomial fit line.把剩下的B,C,D ...