EF Code First:实体映射
2017-01-16 10:07
357 查看
二、实体映射
实体与数据库的映射可以通过DataAnnotation与FluentAPI两种方式来进行映射:
(一) DataAnnotation
DataAnnotation 特性由.NET 3.5中引进,给.NET中的类提供了一种添加验证的方式。DataAnnotation由命名空间System.ComponentModel.DataAnnotations提供。下面列举实体模型中常用的DataAnnotation特性:
KeyAttribute:对应数据库中的主键
RequiredAttribute:对应数据库中字段的数据是否可以为null
MaxLengthAttribute:对应数据库中字符串类型字段的最大长度
MinLengthAttribute:在数据库中无对应,但在代码中字符串最小长度
ConcurrencyCheckAttribute:指定用于开放式并发检查的列的数据类型
TimestampAttribute:将列的数据类型指定为行版本
System.ComponentModel.DataAnnotations命名空间中只定义了部分实体验证的特性,在EntityFramework程序集中定义了更多的数据映射特性:
DatabaseGeneratedAttribute:标记指定实体属性是由数据库生成的,并指定生成策略(None数据库不生成值,Identity当插入行时,数据库生成值,Computed当插入或更新行时,数据库生成值)
ColumnAttribute:指定实体属性在数据库中的列名及数据类型
TableAttribute:指定实体类对应的数据表名
ForeignKeyAttribute:指定导航属性的外键字段
NotMappedAttribute:标记指定实体属性在创建数据库中不创建对应字段
ComplexTypeAttribute:标记指定实体属性是将一个对象作为另一个对象的属性,映射到数据库中则子对象表现为多个属性字段
对于实体关系对应的数据表关系,无非“0:1,1:1,0:N,1:N,N:N”这几种,可以使用导航属性中的数据类型来表示,0…1端使用单实体类型表示,N端使用ICollection<T>集合类型表示。对于单实体端,默认是可为空的,即为0关系,如果要设置为1关系,要使用[Required]标签来进行标记。但对于一对一中的关系主体与依赖对象确无法做更细节的控制。
(二) Fluent API
使用DataAnnotation非常简单,但对于EntityFramework中的特性,就要在实体类中引入EntityFramework程序集,但实体类最好能是保持与架构无关性的POCO类,才能更具通用性。所以,最好是在数据层中使用FluentAPI在数据层中进行实体类与数据库之间的映射工作。
当然,System.ComponentModel.DataAnnotations命名空间的DataAnnotation在EntityFramework程序集中也有相应的API:
HasKey - KeyAttribute:配置此实体类型的主键属性
IsRequired - RequiredAttribute:将此属性配置为必需属性。用于存储此属性的数据库列将不可以为null
HasMaxLength - MaxLengthAttribute:将属性配置为具有指定的最大长度
IsConcurrencyToken - ConcurrencyCheckAttribute:将属性配置为用作开放式并发标记
IsRowVersion - TimestampAttribute:将属性配置为数据库中的行版本。实际数据类型将因使用的数据库提供程序而异。将属性设置为行版本会自动将属性配置为开放式并发标记。
上面这些API均无需引用EntityFramework,推荐使用DataAnnotation方式来设置映射。
以下API的DataAnnotation特性是在EntityFramework中定义,如果也使用DataAnnotation方式来设置映射,就会给实体类增加额外的第三方程序集的依赖。所以以下API的映射推荐使用FluentAPI的方式来设置映射:
ToTable - TableAttribute:配置此实体类型映射到的表名
HasColumnName - ColumnAttribute:配置用于存储属性的数据库列的名称
HasForeignKey - ForeignKeyAttribute:将关系配置为使用在对象模型中的外键属性。如果未在对象模型中公开外键属性,则使用Map方法
Ignore - NotMappedAttribute:从模型中排队某个属性,使该属性不会映射到数据库
HasRequired:通过此实体类型配置必需关系。除非指定此关系,否则实体类型的实例将无法保存到数据库。数据库中的外键不可为null。
HasOptional:从此实体类型配置可选关系。实体类型的实例将能保存到数据库,而无需指定此关系。数据库中的外键可为null。
HasMany:从此实体类型配置一对多关系。
WithOptional:将关系配置为required:optional。(required:0…1端的1,表示必需,不可为null;optional:0…1端的0,表示可选,可为null。下同)
WithOptionalDependent:将关系配置为optional:optional。要配置的实体类型将成为依赖对象,且包含主体的外键。作为关系目标的实体类型将成为关系中的主体。
WithOptionalPrincipal:将关系配置为optional:optional。要配置的实体类型将成为关系中的主体。作为关系目标的实体类型将成为依赖对象,且包含主体的外键。
WithRequired:将关系的指定端配置为必需的,且在关系的另一端有导航属性。
WithRequiredDependent:将关系配置为required:required。要配置的实体类型将成为依赖对象,且包含主体的外键。作为关系目标的实体类型将成为关系中的主体。
WithRequiredPrincipal:将关系配置为required:required。要配置的实体类型将成为关系中的实体。作为关系目标的实体类型将成为依赖对象,且包含主体的外键。
WillCascadeOnDelete:配置是否对关系启用级联删除。
Map:将关系配置为使用未在对象模型中公开的外键属性。可通过指定配置操作来自定义列和表。如果指定了空的配置操作,则约定将生成列名。如果在对象模型中公开了外键属性,则使用 HasForeignKey 方法。并非所有关系都支持在对象模型中公开外键属性。
MapKey:配置外键的列名。
ToTable:配置外键列所在表的名称和架构。
经常用到的DataAnnotation与FluentAPI列举完了,使用上还是遵守这个原则:
如果在System.ComponentModel.DataAnnotations命名空间存在相应的标签,就使用 DataAnnotation 的方式,如果不存在,则使用 FluentAPI 的方式。
实体与数据库的映射可以通过DataAnnotation与FluentAPI两种方式来进行映射:
(一) DataAnnotation
DataAnnotation 特性由.NET 3.5中引进,给.NET中的类提供了一种添加验证的方式。DataAnnotation由命名空间System.ComponentModel.DataAnnotations提供。下面列举实体模型中常用的DataAnnotation特性:
KeyAttribute:对应数据库中的主键
RequiredAttribute:对应数据库中字段的数据是否可以为null
MaxLengthAttribute:对应数据库中字符串类型字段的最大长度
MinLengthAttribute:在数据库中无对应,但在代码中字符串最小长度
ConcurrencyCheckAttribute:指定用于开放式并发检查的列的数据类型
TimestampAttribute:将列的数据类型指定为行版本
System.ComponentModel.DataAnnotations命名空间中只定义了部分实体验证的特性,在EntityFramework程序集中定义了更多的数据映射特性:
DatabaseGeneratedAttribute:标记指定实体属性是由数据库生成的,并指定生成策略(None数据库不生成值,Identity当插入行时,数据库生成值,Computed当插入或更新行时,数据库生成值)
ColumnAttribute:指定实体属性在数据库中的列名及数据类型
TableAttribute:指定实体类对应的数据表名
ForeignKeyAttribute:指定导航属性的外键字段
NotMappedAttribute:标记指定实体属性在创建数据库中不创建对应字段
ComplexTypeAttribute:标记指定实体属性是将一个对象作为另一个对象的属性,映射到数据库中则子对象表现为多个属性字段
对于实体关系对应的数据表关系,无非“0:1,1:1,0:N,1:N,N:N”这几种,可以使用导航属性中的数据类型来表示,0…1端使用单实体类型表示,N端使用ICollection<T>集合类型表示。对于单实体端,默认是可为空的,即为0关系,如果要设置为1关系,要使用[Required]标签来进行标记。但对于一对一中的关系主体与依赖对象确无法做更细节的控制。
(二) Fluent API
使用DataAnnotation非常简单,但对于EntityFramework中的特性,就要在实体类中引入EntityFramework程序集,但实体类最好能是保持与架构无关性的POCO类,才能更具通用性。所以,最好是在数据层中使用FluentAPI在数据层中进行实体类与数据库之间的映射工作。
当然,System.ComponentModel.DataAnnotations命名空间的DataAnnotation在EntityFramework程序集中也有相应的API:
HasKey - KeyAttribute:配置此实体类型的主键属性
IsRequired - RequiredAttribute:将此属性配置为必需属性。用于存储此属性的数据库列将不可以为null
HasMaxLength - MaxLengthAttribute:将属性配置为具有指定的最大长度
IsConcurrencyToken - ConcurrencyCheckAttribute:将属性配置为用作开放式并发标记
IsRowVersion - TimestampAttribute:将属性配置为数据库中的行版本。实际数据类型将因使用的数据库提供程序而异。将属性设置为行版本会自动将属性配置为开放式并发标记。
上面这些API均无需引用EntityFramework,推荐使用DataAnnotation方式来设置映射。
以下API的DataAnnotation特性是在EntityFramework中定义,如果也使用DataAnnotation方式来设置映射,就会给实体类增加额外的第三方程序集的依赖。所以以下API的映射推荐使用FluentAPI的方式来设置映射:
ToTable - TableAttribute:配置此实体类型映射到的表名
HasColumnName - ColumnAttribute:配置用于存储属性的数据库列的名称
HasForeignKey - ForeignKeyAttribute:将关系配置为使用在对象模型中的外键属性。如果未在对象模型中公开外键属性,则使用Map方法
Ignore - NotMappedAttribute:从模型中排队某个属性,使该属性不会映射到数据库
HasRequired:通过此实体类型配置必需关系。除非指定此关系,否则实体类型的实例将无法保存到数据库。数据库中的外键不可为null。
HasOptional:从此实体类型配置可选关系。实体类型的实例将能保存到数据库,而无需指定此关系。数据库中的外键可为null。
HasMany:从此实体类型配置一对多关系。
WithOptional:将关系配置为required:optional。(required:0…1端的1,表示必需,不可为null;optional:0…1端的0,表示可选,可为null。下同)
WithOptionalDependent:将关系配置为optional:optional。要配置的实体类型将成为依赖对象,且包含主体的外键。作为关系目标的实体类型将成为关系中的主体。
WithOptionalPrincipal:将关系配置为optional:optional。要配置的实体类型将成为关系中的主体。作为关系目标的实体类型将成为依赖对象,且包含主体的外键。
WithRequired:将关系的指定端配置为必需的,且在关系的另一端有导航属性。
WithRequiredDependent:将关系配置为required:required。要配置的实体类型将成为依赖对象,且包含主体的外键。作为关系目标的实体类型将成为关系中的主体。
WithRequiredPrincipal:将关系配置为required:required。要配置的实体类型将成为关系中的实体。作为关系目标的实体类型将成为依赖对象,且包含主体的外键。
WillCascadeOnDelete:配置是否对关系启用级联删除。
Map:将关系配置为使用未在对象模型中公开的外键属性。可通过指定配置操作来自定义列和表。如果指定了空的配置操作,则约定将生成列名。如果在对象模型中公开了外键属性,则使用 HasForeignKey 方法。并非所有关系都支持在对象模型中公开外键属性。
MapKey:配置外键的列名。
ToTable:配置外键列所在表的名称和架构。
经常用到的DataAnnotation与FluentAPI列举完了,使用上还是遵守这个原则:
如果在System.ComponentModel.DataAnnotations命名空间存在相应的标签,就使用 DataAnnotation 的方式,如果不存在,则使用 FluentAPI 的方式。
相关文章推荐
- Entity Framework(EF) Code First将实体中的string属性映射成text类型的几种方式
- EF Code First:实体映射,数据迁移,重构
- EF Code First:实体映射,数据迁移,重构(1)
- EF Code First:实体映射,数据迁移,重构(1)
- EF Code First:实体映射,数据迁移,重构
- Code-First将一个实体映射到多张数据库表
- 【极力分享】[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例
- 使用Fluent API进行实体映射【Code-First系列】
- 【Code-First系列】 使用Fluent API进行实体映射
- 【记录】EF Code First 实体关联,如何添加、修改实体?
- EF Code First 学习笔记:表映射
- [C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例
- EF Code First 学习笔记:表映射
- Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例
- EF实体框架之CodeFirst四
- EF CodeFirst EntityTypeConfiguration 自关联映射配置
- EF Code First 学习笔记:表映射
- EF Code First 学习笔记:表映射(转)
- EF Code First数据库映射规则及配置
- MVC3教程之实体模型和EF CodeFirst