要更改ef中的預設配置有兩個方法,乙個是用data annotations(在命名空間system.componentmodel.dataannotations;),直接作用於類的屬性上面;還有乙個就是fluent api,通過新增相應的配置類來覆蓋預設配置。現在我們用這兩個來對比了解ef中的約定配置。
主鍵:key
data annotations:通過key關鍵字來標識乙個主鍵
[key]public
int destinationid
fluent api:
publicclass
breakawaycontext : dbcontext
public dbsetlodgings
protected
override
void
onmodelcreating(dbmodelbuilder modelbuilder)
}
外來鍵
data annotations:
publicint 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
publicclass
person
public
string firstname
public
string lastname
}
看看建立資料的指令碼,會加一句
altertable
[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中的約定配置。...