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的使用方式。
一天一分享,身體好健康。
該追究的不是過去的原因,而是現在的目的。