[Entity Framework][Code First]Configuration-DataType,Nullability,Required,Key

DataType,Nullability,Required,Key

DataType

Convention

String : nvarchar(max)

Integer : int

Byte Array : varbinary(max)

Boolean : bit

Data Annotation

Column(TypeName="XXX")

Fluent API

Entity<T>.Property(t=<t.PropertyName).HasColumnType("XXX")

Code First除了有從property type對應到資料庫DataType有預設的Convention,還有額外提供使用者可以自訂對應到資料庫欄位是什麼DataType。  自訂對應資料庫欄位的型別是要能夠自動轉型的,例如byte[],對應成image,

[Column(TypeName = "image")]
public byte[] Photo { get; set; }

如果無法自動轉型,像是sring對應到int

[Column(TypeName = "int")]
public string Name { get; set; }

則DbModelBuilder會throw MappingException。

 

Nullability and the Required

Convention

Key Properties:not null in database

Reference Types(string,arrays):null in the database

Value Types(all numeric types, DateTime, bool,char):not null in database

Nullable<T> Value Types:null in database

Data Annotation

Required

Fluent API

Entity<T>.Property(t=<t.PropertyName).IsRequired()

對應到資料庫欄位是否為null,如Convention所示。如果要Reference Types為non-nullable 欄位,則可以使用Required。

 

Mapping Keys

Convention

Properites named Id

Properties named [TypeName] + Id

Data Annotation

Key

Fluent API

Entity<T>.HasKey(t => t.PropertyName)

使用Entity Framework開發每一個table都是需要key值,甚至view也是要讓code first知道key值是哪一個欄位,如果沒有Key的存在,則會拋出Exception說fhas no key defined,如以下範例

public class Room
{
    public Guid Identifier { get; set; }

    public DateTime StartTime { get; set; }

    public DateTime EndDate { get; set; }        
}

因為該class的命名沒有符合到Code First 預設對應key的Convention,所以會拋出Exception。  所以這個時候只要指定Identifier為key值,就沒問題了。

[Key]
public Guid Identifier { get; set; }

如果有兩個Key以上的需求,需要指定Order欄位

[Key]
[Column(Order=1)]
public Guid Identifier { get; set; }

[Key]
[Column(Order=2)]
public int Column2 { get; set; }

Fluent API

HasKey(x => new { x.Column1, x.Column2 });

這篇貼的範例都已Data Annotation為主,若讀者想要使用Fluent API也可以,可參考Configuration的使用方式。

 

 

 

 

一天一分享,身體好健康。

該追究的不是過去的原因,而是現在的目的。