EF Code First 學習筆記 約定配置

2021-09-07 09:20:13 字數 3810 閱讀 6433

要更改ef中的預設配置有兩個方法,乙個是用data annotations(在命名空間system.componentmodel.dataannotations;),直接作用於類的屬性上面;還有乙個就是fluent api,通過新增相應的配置類來覆蓋預設配置。現在我們用這兩個來對比了解ef中的約定配置。

主鍵:key

data annotations:通過key關鍵字來標識乙個主鍵

[key]

public int destinationid

fluent api:

public class breakawaycontext : dbcontext

public dbsetlodgings

protected override void onmodelcreating(dbmodelbuilder modelbuilder)

}

外來鍵

data annotations:

public int destinationid 

[foreignkey("destinationid")]

public destination destination

注意,指定列名存在,如上面的destinationid,則類中必須存在名稱為destinationid的屬性。

fluent api:

modelbuilder.entity().hasrequired(p => p.destination).withmany(p=>p.lodgings).hasforeignkey(p => p.destinationid);
長度

data annotations:通過stringlength(長度),minlength(最小長度),maxlength(最大長度)來設定資料庫中字段的長度。

[minlength(10),maxlength(30)]

public string name

[stringlength(30)]

public string country

fluent api:沒有設定最小長度這個方法。

modelbuilder.entity().property(p => p.name).hasmaxlength(30);

modelbuilder.entity().property(p => p.country).hasmaxlength(30);

非空

data annotations:用required來標識,還可以設定是否可允許空字串,顯示錯誤訊息等。

[required]

public string country

[required(errormessage="請輸入描述")]

public string description

fluent api:

modelbuilder.entity().property(p => p.country).isrequired();
資料型別

data annotations:typename

//將string對映成ntext,預設為nvarchar(max)

[column(typename = "ntext")]

public string owner

fluent api:

modelbuilder.entity().property(p => p.owner).hascolumntype("ntext");
表名

data annotations:table

[table("mylodging")]

public class lodging

public string name

public string owner

public decimal price

public bool isresort

public destination destination

}

fluent api:

modelbuilder.entity().totable("mylodging");
列名

data annotations:column

[column("myname")]

public string name

fluent api:

modelbuilder.entity().property(p => p.name).hascolumnname("myname");
自增長

如果主鍵是int型別,ef為預設設定為增長。但如果是guid型別,則要顯示的設定自增長。

data annotations:databasegenerated

public class person

public string firstname

public string lastname

}

看看建立資料的指令碼,會加一句

alter table [dbo].[people] add  default (newid()) for [socialid]
fluent api:

modelbuilder.entity().property(p => p.socialid).hasdatabasegeneratedoption(databasegeneratedoption.identity);
忽略列對映

類中有些屬性,特別是一些通過計算或合併列得出的結果,我們並不需要其記錄到資料庫中,就可以通過配置不讓它生成在資料庫中。

public string name

}

modelbuilder.entity().ignore(p => p.name);
忽略表對映

對於不需要對映到資料庫中的表,我們也可以取消其對映。

data annotations:

public class person

public string firstname

public string lastname

}fluent api:

modelbuilder.ignore();
時間戳

時間戳只對資料型別為byte的屬性有效,並且乙個類中只能有乙個設定為時間戳的屬性。

data annotations:timestamp

[timestamp]

public byte timestamp

fluent api:

modelbuilder.entity().property(p => p.timestamp).isrowversion();
複雜型別

data annotations:complextype

[complextype]

public class address

public string city

}

fluent api:

modelbuilder.complextype();
關於什麼是複雜型別,可以參見:

EF CodeFirst學習筆記1

一直使用ef的dbfirst沒使用過codefirst,而且codefirst使用的人又多,雖然麻煩點但是還是要學下的。來寫個一使用的入門教程 新建乙個codefirst的demo,需引入entityframework 然後簡單建立一模型 這邊以table特性命名emp,預設如果不加此特性約定是以s...

EF Code First 學習筆記 約定配置

要更改ef中的預設配置有兩個方法,乙個是用data annotations 在命名空間system.componentmodel.dataannotations 直接作用於類的屬性上面 還有乙個就是fluent api,通過新增相應的配置類來覆蓋預設配置。現在我們用這兩個來對比了解ef中的約定配置。...

EF Code First 學習筆記 約定配置

要更改ef中的預設配置有兩個方法,乙個是用data annotations 在命名空間system.componentmodel.dataannotations 直接作用於類的屬性上面 還有乙個就是fluent api,通過新增相應的配置類來覆蓋預設配置。現在我們用這兩個來對比了解ef中的約定配置。...