ADO.NET Entity Framework 學習(2)
ADO.NET Entity Framework,即下一代的ADO.NET。它是比Linq To SQL更加強大的ORM,讓開發人員只需要著眼于領域對象模型的開發,而不需要考慮它們是如何與關系數據庫交互。上一篇文章簡單介紹了在項目中如何使用ADO.NET實體框架,從現在開始,正式進入了ADO.NET的學習之旅。這篇文章主要介紹在ADO.NET實體框架中如何進行查詢(以Northwind數據庫為例)。
1. 使用EntityCommand進行查詢
在實體框架中,我們可以通過EntityCommand進行查詢,它的使用方法就像ADO.NET中的SqlCommand。不同的是 SqlCommand使用標準SQL語句對數據庫進行查詢,而EntityCommand使用Entity SQL對EntityContainer進行查詢,當然最終實體框架會將Entity SQL轉換成標準SQL語句查詢數據庫。
EntityConnection con = new EntityConnection("Name=NorthwindEntities"); con.Open(); using (EntityCommand cmd = new EntityCommand("select value c from NorthwindEntities.Customers as c", con)) { EntityDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess); while (reader.Read()) { Console.WriteLine("ID [{0}], ContactTitle [{1}]", reader["CustomerID"], reader["ContactTitle"]); } }
首先是建立一個EntityConnection,它接受一個參數,表明使用的是在config文件中的哪個連接字符串。
<connectionStrings>
<add name="NorthwindEntities" connectionString="metadata=.\Northwind.csdl|.\Northwind.ssdl|.\Northwind.msl;provider=System.Data.SqlClient;provider connection string="Data Source=localhost\sqlexpress;Initial Catalog=Northwind;Integrated Security=True"" providerName="System.Data.EntityClient" />
</connectionStrings>
可以看到這個連接字符串和以往ADO.NET中使用的連接字符串并不一樣。metadata:指明.csdl/.ssdl/.msl三個文件的路徑,這三 個文件的作用以后再做說明。provider:表示使用的是SqlClient或者Oledb或者Odbc。provider connection string:這一項便是以往所用的連接字符串。providerName表示現在用的是EntityClient。
接著構造EntityCommand,最后通過EntityDataReader進行數據的讀取,值得注意的是這里的EntityCommand接受的是Entity SQL語句,而不是標準SQL語句,具體的Entity SQL語法可以參考幫助文檔。
2. 使用ObjectQuery進行查詢
實體框架提供一個名為ObjectQuery的類,它讓開發人員通過Entity SQL進行查詢,查詢結果以對象的形式供使用。
using (NorthwindEntities ctx = new NorthwindEntities()) { ObjectQuery<Customer> query = ctx.CreateQuery<Customer>("NorthwindEntities.Customers"); ObjectResult<Customer> result = query.Execute(MergeOption.NoTracking); foreach (Customer c in result) { Console.WriteLine("ID [{0}], ContactTitle [{1}]", c.CustomerID, c.ContactTitle); } }
首先調用CreateQuery方法來創建ObjectQuery對象(當然這里也可以使用new,只是傳進的參數不同而已),它接受Entity SQL語句作為參數。然后調用Execute方法進行查詢,它接受MergeOption枚舉型的參數,表示解決沖突的方法。查詢結果以對象的形式(這里 是Customer)保存在ObjectResult中。
下面是使用new的寫法:
using (NorthwindEntities ctx = new NorthwindEntities()) { ObjectQuery<Customer> query = new ObjectQuery<Customer>("Customers", ctx); foreach (Customer c in query) { Console.WriteLine("ID [{0}], ContactTitle [{1}]", c.CustomerID, c.ContactTitle); } }
3. ADO.NET Entity Framework Tool自動生成Entities和各個對象的代碼,幫助開發人員減少了很多體力活。這樣,我們可以簡單寫成:
using (NorthwindEntities ctx = new NorthwindEntities()) { foreach (Customer c in ctx.Customers) { Console.WriteLine("ID [{0}], ContactTitle [{1}]", c.CustomerID, c.ContactTitle); } }
其實這里,也是使用ObjectQuery來進行查詢。當然,可以給查詢加上更多的條件,在上一篇文章中也有說明這里就不寫了。
值得關注的是:自動生成的實體類中有這樣一個方法,比如Customer:
public static Customer CreateCustomer(string customerID, string companyName) { Customer customer = new Customer(); customer.CustomerID = customerID; customer.CompanyName = companyName; return customer; }
并不像以前一樣,提供帶參數的構造函數,而是提供CreateCustomer的靜態方法來構造Customer實例。這似乎和前一段時候貧血充血的問題有關了,實體對象該不該有行為,是貧血還是充血?雖然只是一個方法,不過相信這也表明了微軟的態度吧。