Entity Framework 简言之就是一个ORM(Object-Relational Mapper)框架.

  Code First 使得你能够通过C#的类来描述一个模型,模型如何被发现/检测就是通过一些约定(Conventions)。Conventions 就是一系列规则的集合,被用于对基于类别定义的概念模型的自动装配

  这些约定都被定义于 System.Data.Entity.ModelConfiguration.Conventions 命名空间下。

  当然你可以进一步地对你的模型作出配置,例如使用 Data Annotations 或者 Fluent API. 推荐的配置顺序如下:优先使用 Data Annotations ,然后是 Fluent API ,最后才是 Conventions.

  本文将会给出一个关于 Conventions 的初步介绍,具体详细的列表请参考 http://msdn.microsoft.com/en-us/library/system.data.entity.modelconfiguration.conventions(v=vs.103).aspx

一、类型发现约定 Type Discovery

  当我们使用 Entity Framework 进行开发的时候,通常是以构建一些定义概念模型的类开始,除此之外,我们还需要让 DbContext 知道哪些类型需要包含在此模型中,为了达到此目的,我们又会定义一个继承自 DbContext 并且为这些类型暴露 DbSet 属性。这样 Code First 将包含这些类型以及这些类型的引用类型(即便引用类型定义于不同的程序集中)

  如果类型位于继承体系中,也只需为基类(base class)定义 DbSet 属性,那么位于同一程序集中的派生类型也将被自动包含与其中。

  下面的例子中,在类 SchoolEntities 中只定义了一个 DbSet 属性 Departments . Code First 能够发现并钻取所有的引用类型

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web; namespace ContosoUniversity.DAL
{
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 属性(Attribute)或者 DbModelBuilder.Ignore fluent API.

    [NotMapped]
public class Department

  NotMapped 位于 System.ComponentModel.DataAnnotations.Schema 命名空间下

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Ignore<Department>();
}

二、主键约定 Primary Key Convention

  如果类中的属性(Property)名称为 ID (不区分大小写)或 ClassNameID(类名 + ID),Code First 则推断这个属性为主键。如果主键属性的类型为数字型或 GUID 则会被当成标识列(Identity Column

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

三、关系(外键/导航属性)约定 Relationship(Foreign Key/Navigation Properties) Convention

  在 Entity Framework 中,导航属性(Navigation Properties)提供了一种对两个实体类型之间关系的驱动,每一个对象都能拥有它所参与的每一个关系的导航属性(每一个对象的每一个关系都能有一个导航属性),导航属性提供在两端来驱动或操作这个关系,也可以返回任何一方的引用对象(对象间的关系是 1:1 或者 1:0 )或 对象的集合(对象间的关系为 1:* *:*), Code First 根据定义于类型上的导航属性能够推断这种关系

  除了导航属性外,推荐的方式是再包含外键属性(Foreign Key)。Code First 能够推断如下的命名属性为外键(外键属性命名的默认约定):

  • <导航属性名><主体主键属性名>;
  • <主体类名><主键属性名>;
  • <主体主键属性名>

  优先顺序为从上到下(多个满足匹配/约定的时候)。外键属性命名约定也是大小写不敏感的。(PS: 个人觉得把 Principal 译为主体,Dependent Entity 译为从属实体较为稳妥,分别对应主从关系)

  当外键属性被检测到,Code First 将会根据外键的可空性来推断关系的具体形式:如果属性是可空的,那么关系将被注册为可选的;否则则被认为是必须的。

  如果从属实体上的外键是不可为空的,Code First 将会在关系上设置级联删除,反之,则不会级联删除,并且当主体被删除的时候,外键将会被置为 NULL 

  多说一句:以上所说的关系多重性(multiplicity)和级联删除可以被 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; }
}

四、Complex Types Conventions

  如果 Code First 无法从类定义中推断出主键,也没有通过 Data AnnotationsFluent API 注册的主键,则此类型自动注册为 Complex Types. Complex Types 此外还要求类型中不能含有对其它实体类型的引用,并且其它类型中也不能含有对本类型引用的属性集合。一个 Complex Type 示例如下所示

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

五、移除约定(Removing Conventions

  可以移除任何定义于命名空间 System.Data.Entity.ModelConfiguration.Conventions 中的约定,如下列示例移除约定 PluralizingTableNameConvention

    public class SchoolContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}

说明:本文是在学习 Entity Framework Code First Conventions 的随笔记录,对原文做了一个意译以更好地为自己所用。原文请参考 http://msdn.microsoft.com/en-us/data/jj679962 (推荐阅读)

Entity Framework Code First (一)Conventions的更多相关文章

  1. Entity Framework Code First (二)Custom Conventions

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

  2. Entity Framework Code First数据库连接

    1. 安装Entity Framework 使用NuGet安装Entity Framework程序包:工具->库程序包管理器->程序包管理器控制台,执行以下语句: PM> Insta ...

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

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

  4. Entity Framework Code First (三)Data Annotations

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

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

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

  6. Entity Framework Code First约定

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

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

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

  8. Entity Framework Code First数据库连接 转载 https://www.cnblogs.com/libingql/p/3351275.html

    Entity Framework Code First数据库连接   1. 安装Entity Framework 使用NuGet安装Entity Framework程序包:工具->库程序包管理器 ...

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

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

随机推荐

  1. Java虚拟机详解----JVM常见问题总结

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  2. BZOJ2118墨墨的等式[数论 最短路建模]

    2118: 墨墨的等式 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1317  Solved: 504[Submit][Status][Discus ...

  3. NOIP2008传纸条[DP]

    题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...

  4. JAVA 字符串驻留池

    一切从String str = new String("abc")说起...    这行代码形式上很简单,其实很复杂.有一个常见的Java笔试题就是问上面这行代码创建了几个Stri ...

  5. Android驱动入门-LED--HAL硬件抽象层程序设计①

    硬件平台: FriendlyARM Tiny4412 Cortex-A9 操作系统: UBUNTU 14.04 LTS 时间:2016-09-21  16:15:26 设计HAL硬件抽象层程序,则需要 ...

  6. Treap入门(转自NOCOW)

    Treap 来自NOCOW Treap,就是有另一个随机数满足堆的性质的二叉搜索树,其结构相当于以随机顺序插入的二叉搜索树.其基本操作的期望复杂度为O(log n). 其特点是实现简单,效率高于伸展树 ...

  7. Nginx中防盗链(下载防盗链和图片防盗链)操作记录

    日常运维工作中,设置防盗链的需求会经常碰到,这也是优化网站的一个必要措施.今天在此介绍Nginx中设置下载防盗链和图片防盗链的操作~ 一.Nginx中下载防盗链的操作记录对于一些站点上的下载操作,有很 ...

  8. AWS CLI 中使用S3存储

    登录 通过控制面板, 在S3管理器中创建一个新的bucket 所有AWS服务 -> 安全&身份 -> IAM -> 组, 创建一个新的组, 例如 "s3-user& ...

  9. 030医疗项目-模块三:药品供应商目录模块——供货商药品目录查询功能----------Dao层:基本的查询语句的编写

    我们安装显示的要求: 我们能看到显示的目录里面有:供货企业的名字(这个数据来自于供货商的表[usergys]),流水号,通用名,剂型(这些都来自药品信息表),供货的状态(这个呢在gysypml_con ...

  10. Cordova - 使用Cordova开发iOS应用实战3(添加Cordova控制台插件)

    Cordova - 使用Cordova开发iOS应用实战3(添加Cordova控制台插件) 前文介绍了通过 Safari 的 Web检查器,可以看到控制台输出的信息.但有时这样调试代码不太方便,如果在 ...