Entity Framework快速入門–CodeOnly POCO

來源:互聯網
上載者:User

前幾篇文章我簡單介紹了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快速入門--索引貼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.