[VS2010] ADO.NET Entity Framework 新功能:模型優先設計 (Model First Design)

[VS2010] ADO.NET Entity Framework 新功能:模型優先設計 (Model First Design)

ADO.NET Entity Framework 可說是 ADO.NET 進化下的重要產物之一,它是微軟的第一個 ORM (Object-Relational Mapping) 解決方案,它的出現也間接的讓 LINQ 能夠控制到關聯式資料庫,並且取代 LINQ to SQL 成為微軟欽定的 LINQ to Database 的核心類別庫,而它的主要設計工具 Entity Data Model Designer 可以讓開發人員很簡單的將資料庫中的東西撈出來變成 EDM 所要的三層資訊 (Conceptual, Mapping 與 Storage Schema),Object Service 就能利用這些資料來處理物件和資料欄位間的對應,以及讓 LINQ 來存取它。但 Entity Framework 1.0 的 EDM 只有實作單向的作業,由資料庫來產生資料模式,無法先建出資料模式再匯到資料庫中,也就是 Entity Framework 1.0 沒有產生 DDL (Data Definition Language) 的能力。

 

只是,平常在設計資料庫時,大多會先設計出 ER-Model,熟悉或有寫過資料庫或商用系統的應該都很清楚,沒有 ER-Model 的話設計不出好的資料結構,設計出 ER-Model 以後就進入實體設計階段 (Physical Design),將 Model 建到資料庫中,如果要利用 Entity Framework 的話,得先要將資料結構建到資料庫後,再用 EDM Generator 來產生 EDM,感覺像是多繞了一些路,而 Entity Framework 2.0 正是要改變這個情況的新版本,Entity Framework 2.0 支援先建立概念模型 (Conceptual Model) 的方式將資料模型先設計好,再將資料模型倒到指定的資枓庫 (相關的 DDL 生成由 Provider 提供),如此就可以少一個先建結構再產生 EDM 的工作,會讓開發的時間快一些,工作也少一些。

 

當在 Visual Studio 2010 中新建 EDM 時,可以看到多了一個選項 - Empty Model:

 

image

 

選擇它並按 Finish 後,Visual Studio 會生成一個空的Schema,這個 Schema 可以讓開發人員 (或資料庫設計人員) 由工具列中拖放以建構新的 EDM:

 

image

 

接著,開發人員設計好資料模型的 Schema 以及各種屬性,像是繼承或是關聯等等:

 

image

 

然後,在設計工具上按右鍵,選擇 Generate Database from Model…

 

image

 

接著設定好要建立 Model 的資料庫連線 (事先可以在 Server Explorer 建立空資料庫),EDM Generator 會幫開發人員產生必要的 Entity Model Connection String:

 

image

 

按 Next,EDM Generator 會產生這個 Conceptual Model 所需要的 DDL 指令:

 

image

 

下列指令即是由 EDM Generator 所產生的 DDL 指令的一部份 (CREATE TABLE) :

 

-- --------------------------------------------------
-- Creating all tables
-- --------------------------------------------------

-- Creating table 'CustomersSet'
CREATE TABLE [dbo].[CustomersSet] (
    [Id] int  NOT NULL,
    [Name] nvarchar(max)  NOT NULL,
    [Address] nvarchar(max)  NOT NULL,
    [Phone] nvarchar(max)  NOT NULL
);
GO
-- Creating table 'OrdersSet'
CREATE TABLE [dbo].[OrdersSet] (
    [OrderID] int  NOT NULL,
    [OrderDate] nvarchar(max)  NOT NULL,
    [CustomerID] nvarchar(max)  NOT NULL,
    [Amount] nvarchar(max)  NOT NULL,
    [Customers_Id] int  NOT NULL
);
GO
-- Creating table 'CustomersSet_VipCustomers'
CREATE TABLE [dbo].[CustomersSet_VipCustomers] (
    [VipLevel] nvarchar(max)  NOT NULL,
    [Id] int  NOT NULL
);
GO

 

按 Finish,在執行之前,EDM Generator 會通知會覆寫原有的 SSDL (Storage Schema) 以及 MSL (Mapping Schema),若無問題可按 YES:

 

image

 

完成後,EDM Generator 會輸出 DDL 到編輯器中,開發人員可以在這個畫面中連結資料庫,並且將 DDL 送至資料庫執行,以生成與 EDM 相符的資料結構:

 

image

 

image

 

若想要控制 EDM Generator 產生的 DDL 的屬性,可以在 Model 的屬性視窗中設定,但目前可設定的有限:

 

image

 

另一個值得一提的是,在 Entity Framework 2.0 中,開發人員可以選擇要將 EDM 存到專案的目錄 (Copy to Output Directory) 或是內嵌在組件中 (Embed in Output Assembly),若選擇前者,EDM 會以 1.0 的 XML 格式儲存,但若選擇後者,則 EDM 會以 2.0 新增的 Code Only 模式寫入到 .designer.cs 中,例如下列程式碼就是 Code Only EDM 的一部份:

 

image

 

Code Only EDM 筆者將會在接下來的文章介紹,它可以允許開發人員使用程式碼的方式來定義 EDM。

 

參考資料:

Sneak Preview: Model First in the Entity Framework 4.0

http://blogs.msdn.com/adonet/archive/2009/05/12/sneak-preview-model-first-in-the-entity-framework-4-0.aspx