前幾篇文章我簡單介紹了Entity Framework的概念以及介紹了Database First方式執行個體和Model First方式執行個體。今天我們將介紹另外一種令人興奮的開發方式:CodeOnly!當然EF對於POCO(Plain Old CLR Object)的支援是EF4.0中的一大特性。也是EF可擴充性提高的一大進步。廢話少說,也是簡單給大家示範一下操作的步驟!先簡單說一下流程,然後再看下面的!
流程:在EDMX設計器裡設計 實體模型→根據實體編寫相應的實體類代碼→編寫資料庫提供者網關→測試結果
那開始我們的EF POCO的旅行吧!
第一步:建立項目
第二步:設計實體模型
在項目上右擊 添加建立項目 添加Ado.Net實體資料模型,選擇通過空模型來建立。在實體模型設計器中,右擊 屬性設定實體模型的代碼建置原則 :無,這一步的設定是為了不讓EF自動幫我們產生實體類代碼等,而是由我們自己來定義實體類的代碼,這樣靈活性更高,而且我們可以在實體類上做擴張更方便,可維護性也更高。設定如所示:
然後添加如下兩個實體,如所示:
在這簡單說明一下,兩個實體之間有個一對多的關係,這個只需要我們在實體模型設計器中添加關聯就可以了。
這一步做好之後,我們還是通過模型來產生資料庫!【這裡就不多說了,可以參考前面的文章】
第三步:根據設計好的實體編寫對應的實體類
分別編寫Department類、Car類。屬性的名字要跟模型上的屬性一樣。
Department類 代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EFPoco
{
public class Department
{
public int ID { get; set; }
public string Name { get; set; }
public string Master { get; set; }
public IList<Car> Car { get; set; }
}
}
Car類代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EFPoco
{
public class Car
{
public int ID { get; set; }
public string Name { get; set; }
public int DepartmentID { get; set; }
public string Size { get; set; }
public Department Department { get; set; }//對應的外鍵關係
}
}
注意:綠色部分是跟其他代碼有點區別,因為存在兩個表的一(department)對多(car)的關係,所以在設計這個實體類的時候,car只能有一個Department對象的屬性,而Department應該有一個car集合對象的屬性。
另外就是實體類可以分別放置到其他的Assembly中,並不限制放置於EDMX的項目中!這個特性也是非常令人興奮的!
第四步:建立資料庫訪問的網關
添加單獨的資料庫訪問網關的類代碼檔案,添加如下代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
namespace EFPoco
{
public class CompanyContext : ObjectContext
{
//EF產生的連接字串
private static string constr = System.Configuration.ConfigurationManager.ConnectionStrings["CompanyContainer"].ConnectionString;
public CompanyContext()
: base(constr, "CompanyContainer")//第一個參數是EF的連結字串的Value,第二個是實體容器的名稱,可以在實體設計器模型上右擊屬性裡面找到,預設連接字串的KEY也是容器的名字
{
departmentSet = CreateObjectSet<Department>();
carSet = CreateObjectSet<Car>();
}
private ObjectSet<Department> departmentSet;//定義Department表對應的ObjectSet的集合
public ObjectSet<Department> DepartmentSet
{
get { return departmentSet; }
set { departmentSet = value; }
}
private ObjectSet<Car> carSet;//定義Car表對應的ObjectSet的集合
public ObjectSet<Car> CarSet
{
get { return carSet; }
set { carSet = value; }
}
}
}
其實上面這段代碼很簡單,就是定義了一個繼承ObjectContext的類,在此類中加了car和department實體的ObjectSet的集合。
這樣我們所有的準備工作就作為了,下面就是來測試一下你的CodeOnly的結果...
第五步:測試你的成果
using (CompanyContext cc = new CompanyContext())
{
var result = from c in cc.CarSet
select c;
foreach (var m in cc.CarSet)
{
Console.WriteLine( string.Format("name:{0}| size:{1}\r\n", m.Name,m.Size);
}
}
最終運行正確!
總結一下:
我們並沒有用EF自動產生的程式碼,只是使用了它的模型設計器,幫我們產生CSDL/MSL/SSDL的定義檔案(xml).然後我們自己寫實體類的代碼,以及自己寫一個資料庫訪問的網關ObjectContext!這樣帶給我們的驚喜是裡程碑式的,我們可以在實體類上進行擴充,可以把它擴充成領域模型,而且代碼更加靈活,並不受制於EF的自動產生!因為大家都知道,EF自動產生的程式碼有個弊端,首先就是不靈活,再有就是你在上面就行修改後,再用模型更新一下,就會把修改沖刷掉!這是很頭痛的問題,但是有了POCO的支援,我們可以對實體類進行任意的擴充,以及對現有資源的整理,而且為後面的升級維護也提供了基礎!
Entity Framework快速入門--索引貼