EntityFramWork(3 code First 约定)

?

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 约定)

时间: 2024-10-24 07:55:15

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

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

Code First 约定 在前一篇中,我们已经知道了EF Code-First怎样从模型类(domain classes)中创建数据库表,下面,我们开始学习默认的Code-First约定. 什么是约定? 约定就是在Code-First模式中自动配置模型类的默认规则,Code-First约定定义在System.Data.Entity.ModelConfiguration.Conventions 命名空间 让我们来看看各种约定的概述 类型发现(Type Discovery): 在前一篇中,我们创建

Code First约定-Fluent API配置

转自:http://blog.163.com/m13864039250_1/blog/static/2138652482015283397609/ 用Fluent API 配置/映射属性和类型 简介 通常通过重写派生DbContext 上的OnModelCreating 方法来访问Code First Fluent API.以下示例旨在显示如何使用 Fluent API 执行各种任务,您可以将代码复制出来并进行自定义,使之适用于您的模型. 属性映射 Property 方法用于为每个属于实体或复杂

Entity Framework 5.0 Code First全面学习

目录(?)[+] 不贴图片了,太累. Code First 约定 借助 CodeFirst,可通过使用 C# 或Visual Basic .NET 类来描述模型.模型的基本形状可通过约定来检测.约定是规则集,用于在使用 Code First 时基于类定义自动配置概念模型.约定是在 System.Data.Entity.ModelConfiguration.Conventions 命名空间中定义的. 可通过使用数据注释或Fluent API 进一步配置模型.优先级是通过 Fluent API 进行

【译】第4节---简单的Code First示例

原文地址:http://www.entityframeworktutorial.net/code-first/simple-code-first-example.aspx 假设我们要为XYZ学校创建一个简单的应用程序. 该学校的应用程序的用户应该能够添加或更新学生,标准(年级),教师和课程信息.首先,我们开始为我们的学校领域创建类,而不是设计数据库表. 首先,我们将创建两个简单的学生和标准类,其中每个学生都与一个标准相关联,如下所示. public class Student { public

小白学习之Code First(二)

Code First约定: 注:EDMX模板 (SSDL:存储模型=>数据库表 ,CSDL:概念模型=>实体,C-S模型=>存储和概念模型之间的映射关系) System.Data.Entity.ModelConfiguration.Conventions 命名空间 此命名空间包含描述一组规格的类,在使用code first的时候,这些规则用于自动基于类定义配置概念模型(实体类) 在上下文中我们创建了DbSet类集合,CodeFirst会根据DbSet为我们创建数据库表 1 public

Entity Framework 通过Code First 使用 数据库

必备条件 需要安装 Visual Studio 2010 或 Visual Studio 2012.Visual Studio 2013. 如果使用的是 Visual Studio 2010,还需要安装 NuGet. 1.创建应用程序 简单起见,我们将构建一个使用 Code First 执行数据访问的基本控制台应用程序 打开 Visual Studio “文件”->“新建”->“项目…” 从左侧菜单中选择“Windows”和“控制台应用程序” 输入 BlogSolution 作为名称 选择“确

Code First 关系 Fluent API

通过实体框架 Code First,可以使用您自己的域类表示 EF 执行查询.更改跟踪和更新函数所依赖的模型.Code First 利用称为“约定先于配置”的编程模式.这意味着 Code First 将假设类遵循 EF 用于概念模型的架构约定.在这种情况下,EF 将能够找出自己工作所需的详细信息.但是,如果您的类不遵守这些约定,则可以向类中添加配置,以向 EF 提供它需要的信息. Code First 为您提供了两种方法来向类中添加这些配置.一种方法是使用名为 DataAnnotations 的

Entity Framework 5.0 Code First全面学习 (转)

原文地址:感谢原文作者 http://blog.csdn.net/gentle_wolf/article/details/14004345 不贴图片了,太累. Code First 约定 借助 CodeFirst,可通过使用 C# 或Visual Basic .NET 类来描述模型.模型的基本形状可通过约定来检测.约定是规则集,用于在使用 Code First 时基于类定义自动配置概念模型.约定是在 System.Data.Entity.ModelConfiguration.Convention

Entity Framework Code First 学习

必备条件 要完成本演练,需要安装 Visual Studio 2010 或 Visual Studio 2012 或者更高. 如果使用的是 Visual Studio 2010,还需要安装 NuGet. 1.创建应用程序 简单起见,我们将构建一个使用 Code First 执行数据访问的基本控制台应用程序. 打开 Visual Studio “文件”->“新建”->“项目…” 从左侧菜单中选择“Windows”和“控制台应用程序” 输入 EntityFrameworkStudy 作为名称 选择