ADO.NET Entity Framework 學習(1)
前一段時間園子里有很多文章介紹分析了Linq To SQL,它可以說是一個簡單實現的ORM,是微軟針對數據和對象的阻抗不平衡的問題。C# 3.0推出一些新的特性,比如Extension Method, Lambda Expression, Anonymous Type,其實這些新特性都是用來為Linq服務。Linq To SQL將程序員從以往寫大量的sql查詢語句、取值、賦值中解放出來,在intellisense和編譯上做了很多工作,使得這些查詢能夠在編譯期進行檢 查。同時微軟推出ADO.NET Entity Framework,即下一代的ADO.NET。它是比Linq To SQL更加強大的ORM,讓開發人員只需要著眼于領域對象模型的開發,而不需要考慮它們是如何與關系數據庫交互。
本文由一個簡單的例子進行介紹Entity Framework是如何使用的。在此之前,必須下載ADO.NET Entity Framework runtime 和tools,官方也提供了很多示例下載。下面正式開始ADO.NET Entity Framework之旅(開發工具VS 2008 beta,以Northiwind數據庫為例)。
首先建立一個Console project(要選擇.NET Framework 3.5),然后點擊Add New Item,看見ADO.NET Entity Data Model選項:
然后會出現Wizard,選擇數據庫,選擇表、視圖、存儲過程等,按照向導一步步來就可以了,在這里只選擇Customers和Orders表。在 Solution Explore視圖里面點擊Northwind.edmx,可以看到Entity的信息(看上去很像Linq To SQL的dbml設計視圖),然后將它們改名為Customer和Order。
現在我們就可以進行查詢了,先引用命名空間:
using System.Data.Objects; using NorthwindModel;
首先我們查詢所有的Customer,代碼和Linq To SQL中的十分相似。
using (NorthwindEntities ctx = new NorthwindEntities()) { foreach (var customer in ctx.Customers) { Console.WriteLine(customer.CustomerID); } }
接著來查詢某個Customer,
Customer alfki = ctx.Customers.Where("it.CustomerID = 'ALFKI'").First();
"it.CustomerID = 'ALFKI'"表示查詢條件語句,該語句看著又像C#代碼又像SQL,被成為Entity SQL Language,具體語法在幫助文檔上有很詳細的Reference。
這里也可以使用Linq進行查詢(Linq To Entities),需要引用System.Linq命名空間,似乎Entity Framework不支持Single方法,會拋出異常。
Customer alfki = ctx.Customers.First<Customer>(it => it.CustomerID == "ALFKI");
或者
Customer alfki = (from c in ctx.Customers where c.CustomerID == "ALFKIA" select c).First();
在Entity Framework中進行一對多的查詢很簡單,但是值得注意的是Entity Framework默認是Lazy Load,即關聯數據在需要的時候才加載。
在本例子中,如果直接查詢該Customer關聯的orders,查詢不到結果。
foreach (var order in alfki.Orders) { Console.WriteLine(order.OrderID); }
需要在使用orders之前調用 alfki.Orders.Load(), 再次運行便可以得到正確的結果。
[未完待續]