Entity Framework 4.1 之一 : 基礎(chǔ)
原文名稱(chēng):Entity Framework 4.1: Basics (1)
看到 Entity Framework 4.1 推薦英文教程,為了幫大家看起來(lái)方便一些,簡(jiǎn)單翻譯一下。這是一個(gè)系列,共有 8 篇,這是第 1 篇。
- Entity Framework 4.1 之一 : 基礎(chǔ)
- Entity Framework 4.1 之二 : 覆蓋默認(rèn)的約定
- Entity Framework 4.1 之三 : 貪婪加載和延遲加載
- Entity Framework 4.1 之四:復(fù)雜類(lèi)型
- Entity Framework 4.1 之五:多對(duì)多的關(guān)系
- Entity Framework 4.1 之六:樂(lè)觀并發(fā)
- Entity Framework 4.1 之七:繼承
- Entity Framework 4.1 之八:繞過(guò) EF 查詢(xún)映射
讓我們通過(guò)一個(gè)簡(jiǎn)單的實(shí)體模型開(kāi)始吧:訂單和訂單明細(xì),我們使用下面的類(lèi)來(lái)建模。
publicclass Order
{
publicint OrderID { get; set; }
publicstring OrderTitle { get; set; }
publicstring CustomerName { get; set; }
public DateTime TransactionDate { get; set; }
public List<OrderDetail> OrderDetails { get; set; }
}
publicclass OrderDetail
{
publicint OrderDetailID { get; set; }
publicint OrderID { get; set; }
publicdecimal Cost { get; set; }
publicstring ItemName { get; set; }
public Order Order { get; set; }
}
{
publicint OrderID { get; set; }
publicstring OrderTitle { get; set; }
publicstring CustomerName { get; set; }
public DateTime TransactionDate { get; set; }
public List<OrderDetail> OrderDetails { get; set; }
}
publicclass OrderDetail
{
publicint OrderDetailID { get; set; }
publicint OrderID { get; set; }
publicdecimal Cost { get; set; }
publicstring ItemName { get; set; }
public Order Order { get; set; }
}
注意類(lèi)的下述特點(diǎn):
- 沒(méi)有派生自任何 EF 類(lèi)
- 沒(méi)有使用 EF 標(biāo)簽
- 訂單 Order 包含若干的訂單明細(xì) OrderDetail,訂單明細(xì)包含一個(gè)指向訂單的引用。
- 每一個(gè)屬性是:
- 簡(jiǎn)單的 CLR 類(lèi)型,例如:string, int 等等
- 實(shí)體類(lèi)型,例如:訂單
- 實(shí)體的 List 集合,例如:List<OrderDetail>
需要通過(guò)一個(gè)容器將這些類(lèi)映射到數(shù)據(jù)庫(kù),這里稱(chēng)為 Database-Context:
publicclass MyDomainContext : DbContext
{
public DbSet<Order> Orders { get; set; }
public DbSet<OrderDetail> OrderDetails { get; set; }
static MyDomainContext()
{
Database.SetInitializer<MyDomainContext>(
new DropCreateDatabaseIfModelChanges<MyDomainContext>());
}
}
{
public DbSet<Order> Orders { get; set; }
public DbSet<OrderDetail> OrderDetails { get; set; }
static MyDomainContext()
{
Database.SetInitializer<MyDomainContext>(
new DropCreateDatabaseIfModelChanges<MyDomainContext>());
}
}
這個(gè)類(lèi)是 EF 相關(guān)的,它不需要與你的模型類(lèi)出現(xiàn)在同一個(gè)程序集中。
context 必須滿(mǎn)足下面的要求:
- 派生自 System.Data.Entity.DbContext
- 對(duì)于你希望使用的每一個(gè)實(shí)體集定義一個(gè)屬性
- 每一個(gè)屬性的類(lèi)型是 System.Data.Entity.DbSet<T>,T 就是實(shí)體的類(lèi)型
- 每一個(gè)屬性都是讀寫(xiě)屬性 read/write ( get/set )
在這里,DbContext 基類(lèi)通過(guò)反射來(lái)獲取映射到數(shù)據(jù)庫(kù)的實(shí)體。這遵循一系列的約定。
例如,對(duì)于 Order 來(lái)說(shuō),他的屬性 OrderID 必須是主鍵,其它的約定將用來(lái)推斷列名和列的類(lèi)型,默認(rèn)數(shù)據(jù)庫(kù)中的列名是屬性名,使用 string 類(lèi)型來(lái)影射數(shù)據(jù)庫(kù)中的 nvarchar(128), 如果屬性的類(lèi)型是可空的,那么,影射到數(shù)據(jù)庫(kù)中的允許 NULL 等等。以后我們可以看到如果覆蓋這些約定。
我們將增加一個(gè)靜態(tài)的構(gòu)造函數(shù),這個(gè)靜態(tài)的構(gòu)造函數(shù)對(duì)于整個(gè)應(yīng)用程序域來(lái)說(shuō)建立一個(gè)標(biāo)準(zhǔn),當(dāng)數(shù)據(jù)庫(kù)的上下文初始化的時(shí)候,檢查數(shù)據(jù)庫(kù)的架構(gòu)是否與模型相符,如果不是的話(huà),將刪除數(shù)據(jù)庫(kù)然后重新創(chuàng)建它。EF 將會(huì)創(chuàng)建一個(gè)名為 dbo.EdmMetadata 的表,然后將模型結(jié)構(gòu)的 Hash 保存到其中來(lái)實(shí)現(xiàn)。
如果數(shù)據(jù)庫(kù)不存在,EF 將會(huì)創(chuàng)建它,創(chuàng)建什么數(shù)據(jù)庫(kù)呢?默認(rèn)情況下,將在你的本地機(jī)器上,使用上下文對(duì)象名稱(chēng),有許多方式來(lái)覆蓋這個(gè)行為,最簡(jiǎn)單的方式是在配置文件中增加一個(gè)名字為上下文對(duì)象名稱(chēng)的數(shù)據(jù)庫(kù)連接串,在我這里,叫做 MyDomainContext,還可以通過(guò)實(shí)現(xiàn)一個(gè)構(gòu)造函數(shù),然后調(diào)用非默認(rèn)的基類(lèi)構(gòu)造函數(shù)來(lái)實(shí)現(xiàn)。
在下一篇,我將會(huì)演示如果覆蓋這些約定。
posted on 2011-05-06 15:01 冠軍 閱讀(43929) 評(píng)論(22) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號(hào)