1. 程式人生 > >Entity Framework Code First 映射配置屬性

Entity Framework Code First 映射配置屬性

最大 生成策略 目標 req 設置 attr 方法 framework asm

實體與數據庫的映射可以通過DataAnnotation與FluentAPI兩種方式來進行映射:

DataAnnotation

DataAnnotation 特性由.NET 3.5中引進,給.NET中的類提供了一種添加驗證的方式。DataAnnotation由命名空間System.ComponentModel.DataAnnotations提供。下面列舉實體模型中常用的DataAnnotation特性:

  1. KeyAttribute:對應數據庫中的主鍵
  2. RequiredAttribute:對應數據庫中字段的數據是否可以為null
  3. MaxLengthAttribute:對應數據庫中字符串類型字段的最大長度
  4. MinLengthAttribute:在數據庫中無對應,但在代碼中字符串最小長度
  5. ConcurrencyCheckAttribute:指定用於開放式並發檢查的列的數據類型
  6. TimestampAttribute:將列的數據類型指定為行版本

System.ComponentModel.DataAnnotations命名空間中只定義了部分實體驗證的特性,在EntityFramework程序集中定義了更多的數據映射特性:

  1. DatabaseGeneratedAttribute:標記指定實體屬性是由數據庫生成的,並指定生成策略(None數據庫不生成值,Identity當插入行時,數據庫生成值,Computed當插入或更新行時,數據庫生成值)
  2. ColumnAttribute:指定實體屬性在數據庫中的列名及數據類型
  3. TableAttribute:指定實體類對應的數據表名
  4. ForeignKeyAttribute:指定導航屬性的外鍵字段
  5. NotMappedAttribute:標記指定實體屬性在創建數據庫中不創建對應字段
  6. 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:

  1. HasKey - KeyAttribute:配置此實體類型的主鍵屬性
  2. IsRequired - RequiredAttribute:將此屬性配置為必需屬性。用於存儲此屬性的數據庫列將不可以為null
  3. HasMaxLength - MaxLengthAttribute:將屬性配置為具有指定的最大長度
  4. IsConcurrencyToken - ConcurrencyCheckAttribute:將屬性配置為用作開放式並發標記
  5. IsRowVersion - TimestampAttribute:將屬性配置為數據庫中的行版本。實際數據類型將因使用的數據庫提供程序而異。將屬性設置為行版本會自動將屬性配置為開放式並發標記。

上面這些API均無需引用EntityFramework,推薦使用DataAnnotation方式來設置映射。

以下API的DataAnnotation特性是在EntityFramework中定義,如果也使用DataAnnotation方式來設置映射,就會給實體類增加額外的第三方程序集的依賴。所以以下API的映射推薦使用FluentAPI的方式來設置映射:

  1. ToTable - TableAttribute:配置此實體類型映射到的表名
  2. HasColumnName - ColumnAttribute:配置用於存儲屬性的數據庫列的名稱
  3. HasForeignKey - ForeignKeyAttribute:將關系配置為使用在對象模型中的外鍵屬性。如果未在對象模型中公開外鍵屬性,則使用Map方法
  4. Ignore - NotMappedAttribute:從模型中排隊某個屬性,使該屬性不會映射到數據庫
  5. HasRequired:通過此實體類型配置必需關系。除非指定此關系,否則實體類型的實例將無法保存到數據庫。數據庫中的外鍵不可為null。
  6. HasOptional:從此實體類型配置可選關系。實體類型的實例將能保存到數據庫,而無需指定此關系。數據庫中的外鍵可為null。
  7. HasMany:從此實體類型配置一對多關系。
  8. WithOptional:將關系配置為required:optional。(required:0…1端的1,表示必需,不可為null;optional:0…1端的0,表示可選,可為null。下同
  9. WithOptionalDependent:將關系配置為optional:optional。要配置的實體類型將成為依賴對象,且包含主體的外鍵。作為關系目標的實體類型將成為關系中的主體。
  10. WithOptionalPrincipal:將關系配置為optional:optional。要配置的實體類型將成為關系中的主體。作為關系目標的實體類型將成為依賴對象,且包含主體的外鍵。
  11. WithRequired:將關系的指定端配置為必需的,且在關系的另一端有導航屬性。
  12. WithRequiredDependent:將關系配置為required:required。要配置的實體類型將成為依賴對象,且包含主體的外鍵。作為關系目標的實體類型將成為關系中的主體。
  13. WithRequiredPrincipal:將關系配置為required:required。要配置的實體類型將成為關系中的實體。作為關系目標的實體類型將成為依賴對象,且包含主體的外鍵。
  14. WillCascadeOnDelete:配置是否對關系啟用級聯刪除。
  15. Map:將關系配置為使用未在對象模型中公開的外鍵屬性。可通過指定配置操作來自定義列和表。如果指定了空的配置操作,則約定將生成列名。如果在對象模型中公開了外鍵屬性,則使用 HasForeignKey 方法。並非所有關系都支持在對象模型中公開外鍵屬性。
  16. MapKey:配置外鍵的列名。
  17. ToTable:配置外鍵列所在表的名稱和架構。

經常用到的DataAnnotation與FluentAPI列舉完了,使用上還是遵守這個原則:

如果在System.ComponentModel.DataAnnotations命名空間存在相應的標簽,就使用 DataAnnotation 的方式,如果不存在,則使用 FluentAPI 的方式。


作者:郭明鋒

出處:http://www.cnblogs.com/guomingfeng

Entity Framework Code First 映射配置屬性