日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Entity Framework 4 in Action读书笔记——第三章:查询对象模型基础(1)

發布時間:2023/12/31 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Entity Framework 4 in Action读书笔记——第三章:查询对象模型基础(1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本章要點:


1.EF查詢技術。

2.捕捉生成的SQL。

3.深入理解EF查詢引擎。

4.常見的查詢陷阱。


一、查詢引擎入口點

對象服務層最重要的類是ObjectContext。在你的代碼中它是最有用的類,因為它提供了唯一的執行LINQ to Entities查詢的入口點。Visual Studio設計器的一個特征就是生成實體類,這些類繼承自ObjectContext并且每個實體類(有些例外)有一個集合屬性,表示實體集。可以把實體集理解為數據庫,實際上它并不存儲數據,而是對它查詢。后邊會看到對實體集的查詢如何變成SQL并返回數據,現在暫且把注意力放在實體集上。

表示實體集的屬性是ObjectSet<T>類型的。在OrderIT中,這個屬性是Orders,類型為ObjectSet<Order>,下面是它的定義。

public partial class OrderITEntities : ObjectContext {private ObjectSet<Order> _orders;public ObjectSet<Order> Orders{get { return _orders ?? (_orders = CreateObjectSet<Order>("Orders")); }} }

ObjectSet<T>繼承自ObjectQuery<T>。ObjectQuery<T>是在EF 1.0時用的類,ObjectSet<T>與ObjectQuery<T>保持兼容性的同時又新加了一些方便的方法。ObjectContext不是抽象的。向導生成一個繼承自ObjectContext專門的類的唯一原因是自動生成實體集屬性加上一些輔助方法。生成的類是完美的,應該經常使用它。

如果有一種情況,你不能使用它,你可以通過傳連接字符串名稱直接實例化ObjectContext類。然后,就可以使用CreateObjectSet<T>方法,將實體集的名稱作為參數創建ObjectSet<T>實例。下面是代碼:

using (ObjectContext ctx = new ObjectContext("name=ConnStringName")) {var os = ctx.CreateObjectSet<Order>("Orders"); }

如你所看,手動創建一個ObjectSet<T>實例一點都不難。

當實例化設計器產生的上下文類,不需要傳連接字符串給構造器,然而直接對ObjectContext操作就必須傳一個連接字符串了。設計器知道連接字符串是什么,當模板生成上下文類使,它創建了調用基類構造器的構造器,連接字符串傳給基類構造器。上下文類中得構造器如下面片段所示:

public OrderITEntities() : base("name=ConnStringName") { }

二、設置連接字符串

你已經看到,連接字符串對ObjectContext來說是強制性的。如何傳遞連接字符串在EF Framework和ADO.NET Framework中有細微的不同,在EF中必須給連接字符串加一個Name=前綴:Name=ConnStringName。跟過去相比,這不是唯一的不同。連接字符串本身很古怪,下面的代碼就是OrderIT配置文件中的連接字符串。

<add name="OrderITEntities" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=OrderIT;persist security info=True;user id=sa;password=sa;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

跟以前相比,結構是相同的,但是數據是以不同的方式組織起來的。name表示連接字符串的名稱,它在上下文類中傳遞給構造器。connectionString跟以前見過的有很大的不同,可能看起來還有點糊涂。但是必須得理解它,因為當修改數據庫時必須修改它。它分為三部分:

metadata —指定三個映射文件的位置,以”|”分割。如果文件作為純文本存儲在硬盤中,就指定文件的路徑;如果文件作為資源存儲在程序集中,就使用如下的規定格式:res://*/filename。

provider —為數據庫指定ADO.NET不變的數據提供程序名稱,就好像將providerName填入connectionString節中。

provider connection string —表示連接數據庫的真實字符串。如果包含雙引號,必須使用它的轉義格式&quot;,避免與XML格式發生沖突。

最后是providerName包含System.Data.EntityClient字符串,它是不變的EF數據提供程序的名稱。

設置連接字符串是一項很重要的工作。幸運的是,它是由設計器完成的,只有在更改數據庫時才會觸碰它。如果在運行時動態構建,可以使用EntityConnectionStringBuilder類。

在代碼中創建連接字符串

通常連接字符串放在配置文件中由程序讀取。然后,在一些情況下,需要在運行時改變連接字符串。第一種情況字符串的每個屬性由一個服務返回,這不是最好的架構,但是有時必須使用它。第二種情況,應用程序需要處理兩個不同版本的SQL Server(2005和2008),這意味著有兩個不同的SSDL文件,合適的一個應該是由程序運行是根據數據庫的版本選擇的。有兩個解決方案:

1.手動創建字符串構建連接字符串。

2.運行時使用EntityConnectionStringBuilder構建連接字符串。

不用說,第二種解決方案是更好的選擇。

EntityConnectionStringBuilder類繼承自ADO.NET基礎類DbConnectionStringBuilder,它負責從一組參數構建一個連接字符串和解析一個給定的連接字符串成單獨參數。下表描述了它的屬性。

在描述的第一種情況,可以使用DbConnectionStringBuilder類從一個單獨的參數產生一個連接字符串。你可以從Web服務中取得Metadata, Provider和Provider-ConnectionString參數,使用它們設置連接字符串并且傳遞給上下文類的構造器,如下所示:

var connStringData = proxy.GetConnectionStringData(); var builder = new EntityConnectionStringBuilder(); builder.Provider = connStringData.Provider; builder.Metadata = connStringData.Metadata; builder.ProviderConnectionString = connStringData.ProviderConnectionString; using (var ctx = new OrderITEntities(builder.ConnectionString)) {... }

重要的是數據里不能包含節的名稱。例如provider參數必須包含值System.Data.SqlClient,而不是Provider=System.Data.SqlClient,Provider=會由EntityConnectionStringBuilder類自動進行處理。

第二種情況,在運行時構建連接字符串,只需要改變連接字符串的一部分:SSDL的位置。這種情況下,可以將連接字符串放在配置文件中看,在SSDL位置放一個占位符{0}。一旦知道數據庫的版本就可以用合適的SSDL路徑替換占位符。這可以用簡單的String.Format完成,但是EntityConnectionStringBuilder能夠連接字符串并填入相關的屬性。

下面的解決方案首先加載連接字符串,然后使用String.Format只修改Metadata屬性。

var builder = new EntityConnectionStringBuilder(); builder.ConnectionString = connString; builder.Metadata = String.Format(builder.Metadata, "res://*/Model.ssdl"); using (var ctx = new OrderITEntities(builder.ConnectionString)) {... }

連接字符串只是第一部分,在第一章提到EF最主要的特征是對對象模型查詢而不是對數據庫,下一篇我們把主要精力放在對象模型查詢上。

轉載于:https://www.cnblogs.com/nianming/archive/2011/08/18/2144964.html

總結

以上是生活随笔為你收集整理的Entity Framework 4 in Action读书笔记——第三章:查询对象模型基础(1)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。