Code First 约定

借助 Code First,可通过使用 C# 或 Visual Basic .NET 类来描述模型。模型的基本形状可通过约定来检测。约定是规则集,用于在使用 Code First 时基于类定义自动配置概念模型。约定是在 System.Data.Entity.ModelConfiguration.Conventions 命名空间中定义的。

可通过使用数据注释或 Fluent API 进一步配置模型。优先级是通过 Fluent API 进行配置,然后是通过数据注释,再次是通过约定。有关更多信息,请参见 数据注释、 Fluent API -关系、 Fluent API -类型和属性和 在 VB.NET 中使用 Fluent API。

API 文档中提供了 Code First 约定的详细列表。本主题概述 Code First 使用的约定。

 
 

类型发现

当使用 Code First 开发时,通常是从编写用来定义概念(域)模型的 .NET Framework 类开始。除了定义类之外,还需要让 DbContext 知道模型中要包含哪些类。为此,需要定义一个上下文类,此类派生自 DbContext 并公开需要成为模型一部分的类型的 DbSet 属性。Code First 将包含这些类型,还将包含任何引用类型,即使这些引用类型是在不同的程序集中定义的也是如此。

如果类型存在于继承层次结构中,则为基类定义 DbSet 属性就足够了,如果派生类型位于与基类相同的程序集中,则自动包含这些派生类型。

在下面的示例中,仅对 SchoolEntities 类定义一个 DbSet 属性 (Departments)。Code First 使用此属性来发现并包含任何引用类型。

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 特性或 DbModelBuilder.Ignore Fluent API。

modelBuilder.Ignore<Department>();

 
 

主键约定

如果类的属性名为"ID"(不区分大小写)或类名的后面跟有"ID",则 Code First 会推断该属性是主键。如果主键属性的类型为数值或 GUID,则将其配置为标识列。

public class Department 

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

 
 

关系约定

实体框架中的导航属性提供了一种在两个实体类型之间导航关系的方法。针对对象参与到其中的每个关系,各对象均可以具有导航属性。使用导航属性,可以在两个方向上导航和管理关系,返回引用对象(如果多重性为一或者零或一)或集合(如果多重性为多)。Code First 根据针对类型定义的导航属性来推断关系。

除导航属性外,建议还要包括表示依赖对象的类型的外键属性。任何数据类型与主体主键属性相同、遵循以下一种格式的属性都表示关系的外键:"<导航属性名称><主体主键属性>"、"<主体类名><主键属性名称>"或"<主体主键属性名称>"。如果找到多个匹配项,则优先级符合上面列出的顺序。外键检测不区分大小写。在检测外键属性时,Code First 基于外键的可空性推断关系的多重性。如果属性可以为 Null,则将关系注册为可选关系;否则,将关系注册为必需关系。

如果依赖实体上的外键不能为 Null,则 Code First 对关系设置级联删除。如果依赖实体上的外键可以为 Null,则 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 和 Book 类,其中,Person 包含 ReviewedBooks 和 AuthoredBooks 导航属性,而 Book 类包含 Author 和 Reviewer 导航属性),则需要使用数据注释或 Fluent API 手动配置关系。有关更多信息,请参见 数据注释 - 关系和 Fluent API -关系。

 
 

复杂类型约定

当 Code First 发现无法推断主键以及未通过数据注释或 Fluent API 注册主键的类时,类型会自动注册为复杂类型。复杂类型检测还要求类型不具有引用实体类型的属性,并且未被其他类型的集合属性引用。对于以下类定义,Code First 推断 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 用于发现要使用的连接的约定,请参见 连接和模型。

 
 

移除约定

可以移除在 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 进行开发。

EntityFramWork(3 code First 约定)的更多相关文章

  1. Code First 约定

    Code First 约定 借助 Code First,可通过使用 C# 或 Visual Basic .NET 类来描述模型.模型的基本形状可通过约定来检测.约定是规则集,用于在使用 Code Fi ...

  2. Entity Framework 6新特性:全局性地自定义Code First约定

    2012年12月11日,Entity Framework已经发布了Entity Framework 6 Alpha2,因项目需要,目前已使用了其中的两个特性,今天就来介绍一下第一个特性:全局性地自定义 ...

  3. EF6.0 自定义Code First约定

    自定义Code First约定有三种方式,分别是:Lightweight Conventions(轻量级约定).Configuration Conventions(配置型约定).Model-based ...

  4. 【译】第5节---Code First约定

    原文:http://www.entityframeworktutorial.net/code-first/code-first-conventions.aspx 我们在上一节中已经看到了EF Code ...

  5. EntityFramework Code-First 简易教程(二)-------Code First约定

    Code First 约定 在前一篇中,我们已经知道了EF Code-First怎样从模型类(domain classes)中创建数据库表,下面,我们开始学习默认的Code-First约定. 什么是约 ...

  6. 【EF】Entity Framework 6新特性:全局性地自定义Code First约定

    应用场景 场景一:EF Code First默认使用类名作为表名,如果我们需要给表名加个前缀,例如将类名Category映射到表Shop_Category.将Product映射到Shop_Produc ...

  7. Code First约定-数据注释

    通过实体框架Code First,可以使用您自己的域类表示 EF 执行查询.更改跟踪和更新函数所依赖的模型.Code First 利用称为“约定先于配置”的编程模式.这就是说,Code First 将 ...

  8. Entity Framework Code First约定

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

  9. Code First约定-Fluent API配置

    转自:http://blog.163.com/m13864039250_1/blog/static/2138652482015283397609/ 用Fluent API 配置/映射属性和类型 简介 ...

随机推荐

  1. Linux下部署 apache+jdk+tomcat

    1.输入下面的命令安装apache2: ubuntu@VM-164-86-ubuntu:sudo apt-get install apache2 当提示“您希望继续执行吗?”时  输入 Y 然后等待安 ...

  2. async+await一起使用

    /** get 请求 * @param {接口地址} url * @param {请求参数} params */ get(url,params){ return new Promise((resolv ...

  3. Python中的正则表达式(re)

    import re re.match #从开始位置开始匹配,如果开头没有则无 re.search #搜索整个字符串 re.findall #搜索整个字符串,返回一个list 举例: r(raw)用在p ...

  4. java反编译工具cfr

    http://www.benf.org/other/cfr/ 下载反编译工具 @echo off SET home=%cd% rem 指定存放jar包的目录 SET jar_dir=%home%\ja ...

  5. 在线安装TIDB集群

     在线安装TiDB集群 服务器准备 说明:TiDB8需要能够连接外网,以便下载各类安装包 TiDB4非必须,但最好是有一台,因为后续测试Mysql数据同步或者进行性能比较时,都要用到 TiKV最好是采 ...

  6. 解决idea下载依赖包慢到出奇

    右键项目选中maven选项,然后选择“open settings.xml”或者 “create settings.xml”,然后把如下代码粘贴进去就可以了.重启IDE. <?xml versio ...

  7. iphone 开发h5 踩过的坑

    html,body{ -webkit-text-size-adjust: none; }  // 当需要在中文版chrome浏览器中显示小于12px的字体时,而且此时页面放大效果会被阻止 html,b ...

  8. java后台解析前端传来的json

    @RequestMapping(value = {"save"}) @ResponseBody public Result save(TBaseInterventionPlan m ...

  9. SQL With (递归CTE查询)

    指定临时命名的结果集,这些结果集称为公用表表达式 (CTE).该表达式源自简单查询,并且在单条 SELECT.INSERT.UPDATE 或 DELETE 语句的执行范围内定义.该子句也可用在 CRE ...

  10. python学习笔记之读取配置文件【转自https://my.oschina.net/u/3041656/blog/793467】

    [转自https://my.oschina.net/u/3041656/blog/793467] 最近在接触利用python来写测试框架,本人也是个刚接触python,所以是个小菜鸟,今天开始,一点点 ...