EntityFramwork添加表映射的兩種方法


---恢復內容開始---

Entity Framework Code First的默認行為是使用一系列約定將POCO類映射到表。然而,有時候,不能也不想遵循這些約定,那就需要重寫它們。重寫默認約定有兩種方式:Data Annotations和FluentAPI

一、Fluent API配置屬性 

Code First Fluent API通常情況下是在DbContext的派生類中重寫OnModelCreating方法。

1.配置Length

Length用來描述數組的長度,當前包括string和Byte數組。

默認約定:Code First對string或byte數組的默認長度約定是max。注意:Sql Server Compact中默認最大數組長度是4000。

重寫約定:使用HasMaxLength(nn),參數為可空整數。

   1:  Property(t => t.Name).HasMaxLength(50);

另外關於Length的Fluent API還有下面2個:

IsFixedLength(),配置屬性為固定長度。

IsMaxLength(),配置屬性為數據庫提供程序允許的最大長度。

2.配置Data Type

Data Type表示將.NET類型映射到的數據庫的數據類型。

默認約定:列的數據類型由使用的數據庫提供程序決定。以SQL Server為例:String->nvarchar(max),Integer->int,Byte[]->varbinary(max),Boolean->bit。

重寫約定:使用HasColumnType(“xxx”),下面列子的Photo是byte[]類型,配置映射到image數據類型:

   1:  Property(t => t.Photo).HasColumnType("image");

3.配置允許為空和不允許為空

默認約定:主鍵屬性不允許為空,引用類型(String,array)允許為空,值類型(所有的數字類型,Datetime,bool,char)不允許為空,可空的值類型Nullable<T>允許為空。

重寫約定:使用IsRequired()配置不允許為空,使用IsOptional()配置允許為空。下面配置Name屬性為不為空:

   1:   Property(t => t.Name).IsRequired();

4.配置屬性到指定列

默認約定:映射到與屬性名相同的列。

重寫約定:使用Property(t=>t.屬性名).HasColumnName(“xxx”)。下面配置Name映射到DepartmentName:

   1:  Property(t => t.Name).HasColumnName("DepartmentName");

5.配置主鍵

默認約定:(1)屬性名為ID或Id的默認為主鍵 

                (2)類名+ID或類名+Id默認為主鍵  (其中ID或Id的優先級大於類名+ID或類名+Id)

重寫約定:使用HasKey(t=>t.屬性名)。下面將BlogId配置為主鍵:

   1:   HasKey(t => t.BlogId);

6.配置組合主鍵

下面的例子將DepartmentId和Name屬性組合作為Department類型的主鍵:

   1:  HasKey(t => new { t.DepartmentId, t.Name });

 

 

7.配置Database-Generated

默認約定:整型鍵:Identity。

重寫約定:使用Property(t => t.屬性名).HasDatabaseGeneratedOption(DatabaseGeneratedOption)。

DatabaseGeneratedOption枚舉包括三個成員:

(1) None:數據庫不生成值

(2) Identity:當插入行時,數據庫生成值

(3) Computed:當插入或更新行時,數據庫生成值

整型默認是Identity,數據庫生成值,自動增長,如果不想數據庫自動生成值,使用DatabaseGeneratedOption.None。

Guid類型作為主鍵時,要顯示配置為DatabaseGeneratedOption.Identity。

8.配置TimeStamp/RowVersion的樂觀並發

默認約定:這個沒有默認約定。

配      置:使用Property(t=>t.屬性名).IsRowVersion()

   1:  Property(t => t.RowVersion).IsRowVersion();

9.不配置TimeStamp的樂觀並發

有些數據庫不支持RowVersion類型,但是又想對數據庫的一個或多個字段並發檢查,這時可以使用Property(t=>t.屬性名).IsConcurrencyToken(),下面的例子將SocialSecurityNumber配置為並發檢查。

   1:  Property(t => t.SocialSecurityNumber).IsConcurrencyToken();

10.配置String屬性是否支持Unicode內容

默認約定:默認string是Unicode(在SQL Server中是nvarchar)的。

重寫約定:下面的例子使用IsUnicode()方法將Name屬性配置為varchar類型的。

   1:  Property(t => t.Name).IsUnicode(false);

11.配置小數的精度和小數位數

默認約定:小數是(18,2)

配      置:使用Property(t=>t.屬性名).HasPrecision(n,n)

   1:  public decimal MilesFromNearestAirport { get; set; }

12.復雜類型

默認復雜類型有以下規則:

(1) 復雜類型沒有主鍵屬性 
(2) 復雜類型只能包含原始屬性。 
(3)在其他類中使用復雜類型時,必須表示為非集合類型。

使用DbModelBuilder.ComplexType方法顯示配置為復雜類型:

   1:  modelBuilder.ComplexType<Address>();

13.嵌套的復雜類型

嵌套的復雜類型只需顯示配置外層,內層自動繼承復雜類型的約定。

14.配置復雜類型的屬性

配置復雜類型的屬性和配置實體屬性一樣,具體參考下面的實例。

二、配置屬性實例

下面直接給出代碼,代碼上都有注釋。注:下面的實體主要是為了演示用

   1:      //實體
   2:      public class Trip
   3:      {
   4:          public Guid Identifier { get; set; }
   5:          public DateTime StartDate { get; set; }
   6:          public DateTime EndDate { get; set; }
   7:          public decimal CostUSD { get; set; }
   8:          public string Description { get; set; }
   9:          public byte[] RowVersion { get; set; }
  10:      }
  11:   
  12:      //復雜類型
  13:      public class Address
  14:      {
  15:          public int AddressId { get; set; }
  16:          public string StreetAddress { get; set; }
  17:          public string City { get; set; }
  18:          public string State { get; set; }
  19:          public string ZipCode { get; set; }
  20:      }
  21:   
  22:      //復雜類型
  23:      public class PersonalInfo
  24:      {
  25:          public Measurement Weight { get; set; }
  26:          public Measurement Height { get; set; }
  27:          public string DietryRestrictions { get; set; }
  28:      }
  29:   
  30:      //復雜類型
  31:      public class Measurement
  32:      {
  33:          public decimal Reading { get; set; }
  34:          public string Units { get; set; }
  35:      }
  36:   
  37:      //實體
  38:      public class Person
  39:      {
  40:          public Person()
  41:          {
  42:              Address = new Address();
  43:              Info = new PersonalInfo()
  44:              {
  45:                  Weight = new Measurement(),
  46:                  Height = new Measurement()
  47:              };
  48:          }
  49:   
  50:          public int PersonId { get; set; }
  51:          public int SocialSecurityNumber { get; set; }
  52:          public string FirstName { get; set; }
  53:          public string LastName { get; set; }
  54:          public Address Address { get; set; }
  55:          public byte[] Photo { get; set; }
  56:          public PersonalInfo Info { get; set; }
  57:          public byte[] RowVersion { get; set; }
  58:      }
  59:   
  60:      //對實體Trip的配置,繼承自EntityTypeConfiguration<T>
  61:      public class TripConfiguration : EntityTypeConfiguration<Trip>
  62:      {
  63:          public TripConfiguration()
  64:          {
  65:              //配置Identifier映射到TripId列,並設為主鍵,且默認值為newid()
  66:              HasKey(t => t.Identifier).Property(t => t.Identifier).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).HasColumnName("TripId");
  67:              //配置CostUSD的精度為20,小數位數為3
  68:              Property(t => t.CostUSD).HasPrecision(20, 3);
  69:              //配置Description的長度為500
  70:              Property(t => t.Description).HasMaxLength(500);
  71:              //配置RowVersion樂觀並發檢查
  72:              Property(t => t.RowVersion).IsRowVersion();
  73:          }
  74:      }
  75:   
  76:      //對實體Person的配置,繼承自EntityTypeConfiguration<T>
  77:      public class PersonConfiguration : EntityTypeConfiguration<Person>
  78:      {
  79:          public PersonConfiguration()
  80:          {
  81:              //配置SocialSecurityNumber不允許為空且樂觀並發檢查
  82:              Property(t => t.SocialSecurityNumber).IsRequired().IsConcurrencyToken();
  83:              //配置FirstName不允許為空
  84:              Property(t => t.FirstName).IsRequired();
  85:              //配置LastName不允許為空
  86:              Property(t => t.LastName).IsRequired();
  87:              //配置Photo映射到數據庫的數據類型為image
  88:              Property(t => t.Photo).HasColumnType("image");
  89:              //配置RowVersion樂觀並發檢查
  90:              Property(t => t.RowVersion).IsRowVersion();
  91:          }
  92:      }
  93:   
  94:      //對復雜類型Address的配置,繼承自ComplexTypeConfiguration<T>
  95:      public class AddressConfiguration : ComplexTypeConfiguration<Address>
  96:      {
  97:          public AddressConfiguration()
  98:          {
  99:              //配置AddressId映射到AddressId列
 100:              Property(t => t.AddressId).HasColumnName("AddressId");
 101:              //配置StreetAddress長度為100並映射到StreetAddrress列
 102:              Property(t => t.StreetAddress).HasMaxLength(100).HasColumnName("StreetAddress");
 103:              //配置State長度為50並映射到State列
 104:              Property(t => t.State).HasMaxLength(50).HasColumnName("State");
 105:              //配置City長度為50並映射到City列
 106:              Property(t => t.City).HasMaxLength(50).HasColumnName("City");
 107:              //配置ZipCode映射到ZipCode列,不支持Unicode內容,並設為固定長度為6
 108:              Property(t => t.ZipCode).IsUnicode(false).IsFixedLength().HasMaxLength(6).HasColumnName("ZipCode");
 109:          }
 110:      }
 111:   
 112:      //對復雜類型PersonalInfo的配置,繼承自ComplexTypeConfiguration<T>
 113:      public class PersonalInfoConfiguration : ComplexTypeConfiguration<PersonalInfo>
 114:      {
 115:          public PersonalInfoConfiguration()
 116:          {
 117:              //配置DietryRestrictions長度為100
 118:              Property(t => t.DietryRestrictions).HasMaxLength(100);
 119:          }
 120:      }
 121:   
 122:      public class BreakAwayContext : DbContext
 123:      {
 124:          public DbSet<Trip> Trips { get; set; }
 125:          public DbSet<Person> People { get; set; }
 126:   
 127:          protected override void OnModelCreating(DbModelBuilder modelBuilder)
 128:          {
 129:              //注冊配置
 130:              modelBuilder.Configurations.Add(new TripConfiguration());
 131:              modelBuilder.Configurations.Add(new PersonConfiguration());
 132:              modelBuilder.Configurations.Add(new AddressConfiguration());
 133:              modelBuilder.Configurations.Add(new PersonalInfoConfiguration());
 134:              base.OnModelCreating(modelBuilder);
 135:          }
 136:      }

最后生成的數據庫結構,如下圖所示:

Trips表

QQ截圖20121106235602

People表

QQ截圖20121106235647

二、 System.ComponentModel.DataAnnotations

DataAnnotations提供了若干個屬性用於設置實體類字段,Data Annotations在功能上是Fluent API的子集,Data Annotations在功能上是Fluent API的子集。

1.Association(指定某個實體成員表示某種數據關系,如外鍵關系)

2.AttributeUsage(指定另一特性類的用法。 此類不能被繼承)

3.BindableType(指定類型是否通常用於綁定)、Compare(提供比較兩個屬性的屬性)

4.ComplexType

跨一組類描述域實體,然后將這些類分層以描述一個完整實體的情況並不少見。例如,您可以向模型中添加一個名為 BlogDetails 的類

請注意,BlogDetails 沒有任何鍵屬性類型。在域驅動的設計中,BlogDetails 稱為值對象。實體框架將值對象稱為復雜類型。復雜類型不能自行跟蹤。但是 BlogDetails 作為 Blog 類中的一個屬性,將作為 Blog 對象的一部分被跟蹤。為了讓 Code First 認識到這一點,您必須將 BlogDetails 類標記為 ComplexType。

現在,您可以在Blog 類中添加一個屬性來表示該博客的 BlogDetails。

在數據庫中,Blog表將包含該博客的所有屬性,包括在其 BlogDetail 屬性中所含的屬性。默認情況下,每個屬性都將添加復雜類型名稱前綴 BlogDetail。

另外,有趣的是,雖然DateCreated 屬性在類中定義為不可為空的 DateTime,但相關數據庫字段是可為空的。如果想影響數據庫架構,則必須使用 Required 注釋。

4.ConcurrencyCheck (指定某屬性將參與開放式並發檢查)請注意,BlogDetails沒有任何鍵屬性類型。在域驅動的設計中,BlogDetails稱為值對象。實體框架將值對象稱為復雜類型。復雜類型不能自行跟蹤。

但是BlogDetails作為Blog類中的一個屬性,將作為Blog對象的一部分被跟蹤。為了讓Code First認識到這一點,您必須將BlogDetails類標記為ComplexType。

5.CreditCardAttribute(指定數據字段值是信用卡號碼)

6.CustomValidationAttribute(指定自定義的驗證方法來驗證屬性或類的實例)

6.DataType(指定要與數據字段關聯的附加類型的名稱)

7.Display(提供一個通用特性,使您可以為實體分部類的類型和成員指定可本地化的字符串)

8.DisplayColumn(將所引用的表中顯示的列指定為外鍵列)

9.DisplayFormat(指定 ASP.NET 動態數據如何顯示數據字段以及如何設置數據字段的格式)

10.Editable(指示數據字段是否可編輯)

11.EmailAddress(確認一電子郵件地址)

12.EnumDataType(使 .NET Framework 枚舉能夠映射到數據列)

13.FileExtensions(文件擴展名驗證)

14.FilterUIHint

表示一個特性,該特性用於指定列的篩選行為

15.Key

該屬性將映射到數據庫中的主鍵列

當使用Code First的數據庫生成功能,則Blog表將具有名為PrimaryTrackingKey的主鍵列,該列默認情況下還定義為Identity。

16.MaxLength和MinLength

指定屬性中允許的數組或字符串數據的最大\小長度

MaxLength 注釋將通過把屬性長度設置為 10 來影響數據庫。MinLength屬性不會對數據庫產生影響。

17.MetadataType

指定要與數據模型類關聯的元數據類

18.NotMapped

Code First 約定指示具有受支持數據類型的每個屬性都要在數據庫中有表示。但在您的應用程序中並不總是如此。例如,您可以在 Blog 類中使用一個屬性來基於 Title 和BloggerName 字段創建代碼。該屬性可以動態創建,無需存儲。您可以使用 NotMapped 注釋來標記不映射到數據庫的所有屬性,如下面的 BlogCode 屬性。

 

19.Phone(使用電話號碼的正則表達式,指定數據字段值是一個格式良好的電話號碼)

20.Range(指定數據字段值的數值范圍約束)

21.RegularExpression(指定 ASP.NET 動態數據中的數據字段值必須與指定的正則表達式匹配)

22.Required

Required 注釋告訴 EF 某一個特定屬性是必需的

Required 特性將使被映射的屬性不可為空來影響生成的數據庫。請注意,Title 字段已經更改為“not null”。

23.ScaffoldColumn(指定類或數據列是否使用基架)

24.ScaffoldTable(指定類或數據表是否使用基架)

25.StringLength(指定數據字段中允許的最小和最大字符長度)

26.Timestamp(將列的數據類型指定為行版本)

27.UIHint(指定動態數據用來顯示數據字段的模板或用戶控件)

28.Url(提供 URL 驗證)

三、結束語

本篇文章的內容比較簡單,就是一些配置,了解理論知識並熟悉運用是關鍵。

點擊查看《Entity Framework實例詳解》系列的其他文章。

如果遇到問題,可以訪問Entity Framework社區,網址是www.ef-community.com

---恢復內容結束---

Entity Framework Code First的默認行為是使用一系列約定將POCO類映射到表。然而,有時候,不能也不想遵循這些約定,那就需要重寫它們。重寫默認約定有兩種方式:Data Annotations和FluentAPI

一、Fluent API配置屬性 

Code First Fluent API通常情況下是在DbContext的派生類中重寫OnModelCreating方法。

1.配置Length

Length用來描述數組的長度,當前包括string和Byte數組。

默認約定:Code First對string或byte數組的默認長度約定是max。注意:Sql Server Compact中默認最大數組長度是4000。

重寫約定:使用HasMaxLength(nn),參數為可空整數。

   1:  Property(t => t.Name).HasMaxLength(50);

另外關於Length的Fluent API還有下面2個:

IsFixedLength(),配置屬性為固定長度。

IsMaxLength(),配置屬性為數據庫提供程序允許的最大長度。

2.配置Data Type

Data Type表示將.NET類型映射到的數據庫的數據類型。

默認約定:列的數據類型由使用的數據庫提供程序決定。以SQL Server為例:String->nvarchar(max),Integer->int,Byte[]->varbinary(max),Boolean->bit。

重寫約定:使用HasColumnType(“xxx”),下面列子的Photo是byte[]類型,配置映射到image數據類型:

   1:  Property(t => t.Photo).HasColumnType("image");

3.配置允許為空和不允許為空

默認約定:主鍵屬性不允許為空,引用類型(String,array)允許為空,值類型(所有的數字類型,Datetime,bool,char)不允許為空,可空的值類型Nullable<T>允許為空。

重寫約定:使用IsRequired()配置不允許為空,使用IsOptional()配置允許為空。下面配置Name屬性為不為空:

   1:   Property(t => t.Name).IsRequired();

4.配置屬性到指定列

默認約定:映射到與屬性名相同的列。

重寫約定:使用Property(t=>t.屬性名).HasColumnName(“xxx”)。下面配置Name映射到DepartmentName:

   1:  Property(t => t.Name).HasColumnName("DepartmentName");

5.配置主鍵

默認約定:(1)屬性名為ID或Id的默認為主鍵 

                (2)類名+ID或類名+Id默認為主鍵  (其中ID或Id的優先級大於類名+ID或類名+Id)

重寫約定:使用HasKey(t=>t.屬性名)。下面將BlogId配置為主鍵:

   1:   HasKey(t => t.BlogId);

6.配置組合主鍵

下面的例子將DepartmentId和Name屬性組合作為Department類型的主鍵:

   1:  HasKey(t => new { t.DepartmentId, t.Name });

 

 

7.配置Database-Generated

默認約定:整型鍵:Identity。

重寫約定:使用Property(t => t.屬性名).HasDatabaseGeneratedOption(DatabaseGeneratedOption)。

DatabaseGeneratedOption枚舉包括三個成員:

(1) None:數據庫不生成值

(2) Identity:當插入行時,數據庫生成值

(3) Computed:當插入或更新行時,數據庫生成值

整型默認是Identity,數據庫生成值,自動增長,如果不想數據庫自動生成值,使用DatabaseGeneratedOption.None。

Guid類型作為主鍵時,要顯示配置為DatabaseGeneratedOption.Identity。

8.配置TimeStamp/RowVersion的樂觀並發

默認約定:這個沒有默認約定。

配      置:使用Property(t=>t.屬性名).IsRowVersion()

   1:  Property(t => t.RowVersion).IsRowVersion();

9.不配置TimeStamp的樂觀並發

有些數據庫不支持RowVersion類型,但是又想對數據庫的一個或多個字段並發檢查,這時可以使用Property(t=>t.屬性名).IsConcurrencyToken(),下面的例子將SocialSecurityNumber配置為並發檢查。

   1:  Property(t => t.SocialSecurityNumber).IsConcurrencyToken();

10.配置String屬性是否支持Unicode內容

默認約定:默認string是Unicode(在SQL Server中是nvarchar)的。

重寫約定:下面的例子使用IsUnicode()方法將Name屬性配置為varchar類型的。

   1:  Property(t => t.Name).IsUnicode(false);

11.配置小數的精度和小數位數

默認約定:小數是(18,2)

配      置:使用Property(t=>t.屬性名).HasPrecision(n,n)

   1:  public decimal MilesFromNearestAirport { get; set; }

12.復雜類型

默認復雜類型有以下規則:

(1) 復雜類型沒有主鍵屬性 
(2) 復雜類型只能包含原始屬性。 
(3)在其他類中使用復雜類型時,必須表示為非集合類型。

使用DbModelBuilder.ComplexType方法顯示配置為復雜類型:

   1:  modelBuilder.ComplexType<Address>();

13.嵌套的復雜類型

嵌套的復雜類型只需顯示配置外層,內層自動繼承復雜類型的約定。

14.配置復雜類型的屬性

配置復雜類型的屬性和配置實體屬性一樣,具體參考下面的實例。

二、配置屬性實例

下面直接給出代碼,代碼上都有注釋。注:下面的實體主要是為了演示用

   1:      //實體
   2:      public class Trip
   3:      {
   4:          public Guid Identifier { get; set; }
   5:          public DateTime StartDate { get; set; }
   6:          public DateTime EndDate { get; set; }
   7:          public decimal CostUSD { get; set; }
   8:          public string Description { get; set; }
   9:          public byte[] RowVersion { get; set; }
  10:      }
  11:   
  12:      //復雜類型
  13:      public class Address
  14:      {
  15:          public int AddressId { get; set; }
  16:          public string StreetAddress { get; set; }
  17:          public string City { get; set; }
  18:          public string State { get; set; }
  19:          public string ZipCode { get; set; }
  20:      }
  21:   
  22:      //復雜類型
  23:      public class PersonalInfo
  24:      {
  25:          public Measurement Weight { get; set; }
  26:          public Measurement Height { get; set; }
  27:          public string DietryRestrictions { get; set; }
  28:      }
  29:   
  30:      //復雜類型
  31:      public class Measurement
  32:      {
  33:          public decimal Reading { get; set; }
  34:          public string Units { get; set; }
  35:      }
  36:   
  37:      //實體
  38:      public class Person
  39:      {
  40:          public Person()
  41:          {
  42:              Address = new Address();
  43:              Info = new PersonalInfo()
  44:              {
  45:                  Weight = new Measurement(),
  46:                  Height = new Measurement()
  47:              };
  48:          }
  49:   
  50:          public int PersonId { get; set; }
  51:          public int SocialSecurityNumber { get; set; }
  52:          public string FirstName { get; set; }
  53:          public string LastName { get; set; }
  54:          public Address Address { get; set; }
  55:          public byte[] Photo { get; set; }
  56:          public PersonalInfo Info { get; set; }
  57:          public byte[] RowVersion { get; set; }
  58:      }
  59:   
  60:      //對實體Trip的配置,繼承自EntityTypeConfiguration<T>
  61:      public class TripConfiguration : EntityTypeConfiguration<Trip>
  62:      {
  63:          public TripConfiguration()
  64:          {
  65:              //配置Identifier映射到TripId列,並設為主鍵,且默認值為newid()
  66:              HasKey(t => t.Identifier).Property(t => t.Identifier).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).HasColumnName("TripId");
  67:              //配置CostUSD的精度為20,小數位數為3
  68:              Property(t => t.CostUSD).HasPrecision(20, 3);
  69:              //配置Description的長度為500
  70:              Property(t => t.Description).HasMaxLength(500);
  71:              //配置RowVersion樂觀並發檢查
  72:              Property(t => t.RowVersion).IsRowVersion();
  73:          }
  74:      }
  75:   
  76:      //對實體Person的配置,繼承自EntityTypeConfiguration<T>
  77:      public class PersonConfiguration : EntityTypeConfiguration<Person>
  78:      {
  79:          public PersonConfiguration()
  80:          {
  81:              //配置SocialSecurityNumber不允許為空且樂觀並發檢查
  82:              Property(t => t.SocialSecurityNumber).IsRequired().IsConcurrencyToken();
  83:              //配置FirstName不允許為空
  84:              Property(t => t.FirstName).IsRequired();
  85:              //配置LastName不允許為空
  86:              Property(t => t.LastName).IsRequired();
  87:              //配置Photo映射到數據庫的數據類型為image
  88:              Property(t => t.Photo).HasColumnType("image");
  89:              //配置RowVersion樂觀並發檢查
  90:              Property(t => t.RowVersion).IsRowVersion();
  91:          }
  92:      }
  93:   
  94:      //對復雜類型Address的配置,繼承自ComplexTypeConfiguration<T>
  95:      public class AddressConfiguration : ComplexTypeConfiguration<Address>
  96:      {
  97:          public AddressConfiguration()
  98:          {
  99:              //配置AddressId映射到AddressId列
 100:              Property(t => t.AddressId).HasColumnName("AddressId");
 101:              //配置StreetAddress長度為100並映射到StreetAddrress列
 102:              Property(t => t.StreetAddress).HasMaxLength(100).HasColumnName("StreetAddress");
 103:              //配置State長度為50並映射到State列
 104:              Property(t => t.State).HasMaxLength(50).HasColumnName("State");
 105:              //配置City長度為50並映射到City列
 106:              Property(t => t.City).HasMaxLength(50).HasColumnName("City");
 107:              //配置ZipCode映射到ZipCode列,不支持Unicode內容,並設為固定長度為6
 108:              Property(t => t.ZipCode).IsUnicode(false).IsFixedLength().HasMaxLength(6).HasColumnName("ZipCode");
 109:          }
 110:      }
 111:   
 112:      //對復雜類型PersonalInfo的配置,繼承自ComplexTypeConfiguration<T>
 113:      public class PersonalInfoConfiguration : ComplexTypeConfiguration<PersonalInfo>
 114:      {
 115:          public PersonalInfoConfiguration()
 116:          {
 117:              //配置DietryRestrictions長度為100
 118:              Property(t => t.DietryRestrictions).HasMaxLength(100);
 119:          }
 120:      }
 121:   
 122:      public class BreakAwayContext : DbContext
 123:      {
 124:          public DbSet<Trip> Trips { get; set; }
 125:          public DbSet<Person> People { get; set; }
 126:   
 127:          protected override void OnModelCreating(DbModelBuilder modelBuilder)
 128:          {
 129:              //注冊配置
 130:              modelBuilder.Configurations.Add(new TripConfiguration());
 131:              modelBuilder.Configurations.Add(new PersonConfiguration());
 132:              modelBuilder.Configurations.Add(new AddressConfiguration());
 133:              modelBuilder.Configurations.Add(new PersonalInfoConfiguration());
 134:              base.OnModelCreating(modelBuilder);
 135:          }
 136:      }

最后生成的數據庫結構,如下圖所示:

Trips表

QQ截圖20121106235602

People表

QQ截圖20121106235647

二、 System.ComponentModel.DataAnnotations

DataAnnotations提供了若干個屬性用於設置實體類字段,Data Annotations在功能上是Fluent API的子集,Data Annotations在功能上是Fluent API的子集。

1.Association(指定某個實體成員表示某種數據關系,如外鍵關系)

2.AttributeUsage(指定另一特性類的用法。 此類不能被繼承)

3.BindableType(指定類型是否通常用於綁定)、Compare(提供比較兩個屬性的屬性)

4.ConcurrencyCheck(指定某屬性將參與開放式並發檢查)

5.CreditCardAttribute(指定數據字段值是信用卡號碼)

6.CustomValidationAttribute(指定自定義的驗證方法來驗證屬性或類的實例)

6.DataType(指定要與數據字段關聯的附加類型的名稱)

7.Display(提供一個通用特性,使您可以為實體分部類的類型和成員指定可本地化的字符串)

8.DisplayColumn(將所引用的表中顯示的列指定為外鍵列)

9.DisplayFormat(指定 ASP.NET 動態數據如何顯示數據字段以及如何設置數據字段的格式)

10.Editable(指示數據字段是否可編輯)

11.EmailAddress(確認一電子郵件地址)

12.EnumDataType(使 .NET Framework 枚舉能夠映射到數據列)

13.FileExtensions(文件擴展名驗證)

14.FilterUIHint(表示一個特性,該特性用於指定列的篩選行為)

15.Key(該屬性將映射到數據庫中的主鍵列)


如果您在使用Code First 的數據庫生成功能,則Blog 表將具有名為 PrimaryTrackingKey 的主鍵列,該列默認情況下還定義為 Identity。

16.MaxLength(指定屬性中允許的數組或字符串數據的最大長度)

MaxLength 注釋將通過把屬性長度設置為 10 來影響數據庫。MinLength屬性不會對數據庫產生影響。

 

17.MetadataType(指定要與數據模型類關聯的元數據類)

18.MinLength(指定屬性中允許的數組的字符串數據的最小長度)

19.Phone(使用電話號碼的正則表達式,指定數據字段值是一個格式良好的電話號碼)

20.Range(指定數據字段值的數值范圍約束)

21.RegularExpression(指定 ASP.NET 動態數據中的數據字段值必須與指定的正則表達式匹配)

22.Required(Required 注釋告訴 EF 某一個特定屬性是必需的)

Required 特性將使被映射的屬性不可為空來影響生成的數據庫。請注意,Title 字段已經更改為“not null”。

23.ScaffoldColumn(指定類或數據列是否使用基架)

24.ScaffoldTable(指定類或數據表是否使用基架)

25.StringLength(指定數據字段中允許的最小和最大字符長度)

26.Timestamp(將列的數據類型指定為行版本)

27.UIHint(指定動態數據用來顯示數據字段的模板或用戶控件)

28.Url(提供 URL 驗證)

三、結束語

本篇文章的內容比較簡單,就是一些配置,了解理論知識並熟悉運用是關鍵。

點擊查看《Entity Framework實例詳解》系列的其他文章。

如果遇到問題,可以訪問Entity Framework社區,網址是www.ef-community.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM