1. 程式人生 > >Entity Framework 4.1 之一 : 基礎

Entity Framework 4.1 之一 : 基礎

原文名稱:Entity Framework 4.1: Basics (1) 讓我們通過一個簡單的實體模型開始吧:訂單和訂單明細,我們使用下面的類來建模。 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; }
}
注意類的下述特點:
  • 沒有派生自任何 EF 類
  • 沒有使用 EF 標籤
  • 訂單 Order 包含若干的訂單明細 OrderDetail,訂單明細包含一個指向訂單的引用。
  • 每一個屬性是:
    • 簡單的 CLR 型別,例如:string, int 等等
    • 實體型別,例如:訂單
    • 實體的 List 集合,例如:List<OrderDetail>
需要通過一個容器將這些類對映到資料庫,這裡稱為  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>());
}
}
這個類是 EF 相關的,它不需要與你的模型類出現在同一個程式集中。 context 必須滿足下面的要求:
  • 派生自 System.Data.Entity.DbContext
  • 對於你希望使用的每一個實體集定義一個屬性
  • 每一個屬性的型別是 System.Data.Entity.DbSet<T>,T 就是實體的型別
  • 每一個屬性都是讀寫屬性 read/write ( get/set )
在這裡,DbContext 基類通過反射來獲取對映到資料庫的實體。這遵循一系列的約定。 例如,對於 Order 來說,他的屬性 OrderID 必須是主鍵,其它的約定將用來推斷列名和列的型別,預設資料庫中的列名是屬性名,使用 string 型別來影射資料庫中的 nvarchar(128), 如果屬性的型別是可空的,那麼,影射到資料庫中的允許 NULL 等等。以後我們可以看到如果覆蓋這些約定。 我們將增加一個靜態的建構函式,這個靜態的建構函式對於整個應用程式域來說建立一個標準,當資料庫的上下文初始化的時候,檢查資料庫的架構是否與模型相符,如果不是的話,將刪除資料庫然後重新建立它。EF 將會建立一個名為 dbo.EdmMetadata 的表,然後將模型結構的 Hash 儲存到其中來實現。 如果資料庫不存在,EF 將會建立它,建立什麼資料庫呢?預設情況下,將在你的本地機器上,使用上下文物件名稱,有許多方式來覆蓋這個行為,最簡單的方式是在配置檔案中增加一個名字為上下文物件名稱的資料庫連線串,在我這裡,叫做 MyDomainContext,還可以通過實現一個建構函式,然後呼叫非預設的基類建構函式來實現。 在下一篇,我將會演示如果覆蓋這些約定。