Entity Framework Code First 映射配置屬性
實體與數據庫的映射可以通過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 的方式。
作者:郭明鋒
出處:http://www.cnblogs.com/guomingfeng
Entity Framework Code First 映射配置屬性