久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

ADO.NET Entity Framework 學(xué)習(xí) 1 - VS2010學(xué)習(xí) - IC窗口

 hbjhyhb 2011-01-17

使用實(shí)體框架靈活地為數(shù)據(jù)建模

ADO.NET 實(shí)體框架概念最初是在 2006 年作為 ADO.NET vNext 引入的,,現(xiàn)在它已準(zhǔn)備好要在即將發(fā)布的 Visual Studio® 2008 SP1 中大顯身手,。在歷經(jīng)多年對(duì)類似產(chǎn)品的多次失敗嘗試后,Microsoft 隨 Visual Studio 2008 發(fā)布了部分適合于對(duì)象關(guān)系映射 (ORM) 空間的下列兩種技術(shù):LINQ to SQL 和 ADO.NET Entity Framework,。隨著市場(chǎng)逐漸開始采用這些技術(shù),,開發(fā)人員希望了解我們目前的狀況以及 Microsoft 未來(lái)的發(fā)展方向。他們還希望了解這些技術(shù)開發(fā)背后的原理,、實(shí)體框架不同于市場(chǎng)上其他 ORM 技術(shù)的原因以及 Microsoft 對(duì)這些技術(shù)的投資趨向,。

在 Visual Studio 2008 發(fā)布伊始,,就出現(xiàn)了大量有關(guān) LINQ to SQL 的文章以及介紹應(yīng)采用哪種技術(shù)的文章(請(qǐng)參閱 msdn.microsoft.com/data),。在此我將著重介紹實(shí)體框架,并深入探討在開發(fā)過(guò)程中應(yīng)該如何進(jìn)行選擇以及為何如此選擇,。

Microsoft® 實(shí)體數(shù)據(jù)模型 (EDM) 基于 Peter Chen 博士的實(shí)體關(guān)系 (ER) 模型,,實(shí)際上它是 ADO.NET Entity Framework 背后的驅(qū)動(dòng)力。EDM 也是區(qū)分實(shí)體框架與市場(chǎng)上其他 ORM 型技術(shù)的最明顯特征,。EDM 構(gòu)建在 ER 模型之上,,它將模型的抽象級(jí)別提升到高于邏輯模型的級(jí)別,但同時(shí)仍保留實(shí)體和關(guān)系的概念,。

為什么需要建立另外一種數(shù)據(jù)模型,?

那 么為什么需要建立另外一種模型呢?隨著公司數(shù)據(jù)處理量的增加,,理順數(shù)據(jù)關(guān)系并基于這些數(shù)據(jù)來(lái)開發(fā)應(yīng)用程序變得非常困難,。數(shù)據(jù)庫(kù)架構(gòu)的設(shè)計(jì)需要考慮存儲(chǔ)問(wèn)題 (如數(shù)據(jù)完整性、性能和管理),,有時(shí)候這不是很容易理解,。這些架構(gòu)還經(jīng)常與應(yīng)用程序的結(jié)構(gòu)有沖突,使開發(fā)和維護(hù)工作變得更加復(fù)雜,。

我們 經(jīng)常會(huì)遇到數(shù)據(jù)結(jié)構(gòu)與所構(gòu)建的應(yīng)用程序被分割開的自定義解決方案,。遺憾地是,對(duì)每個(gè)應(yīng)用程序而言,,自定義解決方案的數(shù)量,、各種各樣的方法以及建模數(shù)據(jù)所需 的步驟都各不相同,,導(dǎo)致問(wèn)題不斷產(chǎn)生。整個(gè)行業(yè)都希望能有一種方法來(lái)針對(duì)應(yīng)用程序級(jí)的域模型進(jìn)行定義和開發(fā),,以便能夠與邏輯模型的存儲(chǔ)清晰地分隔開,。因此 引入了實(shí)體框架。

EDM(請(qǐng)參閱圖 1 中描述的示例)允許以組織看待和使用數(shù)據(jù)的方式(不是數(shù)據(jù)的存儲(chǔ)方式)來(lái)定義域模型,。開發(fā) EDM 還有一個(gè)主要目標(biāo),,那就是在 Microsoft 內(nèi)成為用于開發(fā)人員和服務(wù)器技術(shù)套件的核心數(shù)據(jù)模型。

clip_image002[1]

圖 1 某個(gè)博客數(shù)據(jù)庫(kù)的示例實(shí)體數(shù)據(jù)模型

通 過(guò)使用一個(gè)核心數(shù)據(jù)模型,,應(yīng)用程序的維護(hù)得以簡(jiǎn)化,。實(shí)現(xiàn)此目標(biāo)后,EDM 即可發(fā)揮作用,,不但可以為基于 ADO.NET Entity Framework 構(gòu)建的自定義應(yīng)用程序定義模型,,還可以作為報(bào)告和可視化應(yīng)用程序、Intranet 門戶應(yīng)用程序或工作流應(yīng)用程序的輸入內(nèi)容,。

與 ER 模型類似,,EDM 使用以下兩個(gè)主要概念:實(shí)體(事物)以及這些實(shí)體之間的關(guān)系(或關(guān)聯(lián))。在考慮實(shí)體和關(guān)聯(lián)實(shí)例(或這些實(shí)例集操作的封閉包)的存儲(chǔ)時(shí),,還需要用到“集”的 概念,。因此,更清楚地說(shuō),,實(shí)體存在于 EntitySet 中而關(guān)聯(lián)存在于 AssociationSet 中,。

在 EDM 中定義的最后一個(gè)結(jié)構(gòu)概念是 EntityContainer 概念,它可以在之前介紹的實(shí)例和關(guān)系集周圍定義一個(gè)封閉包,。這些簡(jiǎn)單概念在聯(lián)合使用后可允許開發(fā)人員定義一個(gè)域模型,,此模型可被映射回持久性層和在應(yīng)用程 序自身中使用的類。(需要注意的是,,EDM 的持久性層不需要是相關(guān)的,,盡管它現(xiàn)在是相關(guān)的。)

EDM 中定義的每個(gè)實(shí)體類型可包含兩個(gè)不同類型的成員,,一個(gè)是用來(lái)定義實(shí)體的屬性(類似于數(shù)據(jù)庫(kù)中的列),,另一個(gè)是導(dǎo)航屬性,它支持實(shí)體類型參與的導(dǎo)航關(guān)系(通常表示為數(shù)據(jù)庫(kù)中的外鍵),。此外,,每個(gè)實(shí)體類型都必須有一個(gè)唯一的標(biāo)識(shí)或關(guān)鍵字。圖 2 中的 XML 片斷描述了一個(gè) "Blog Post" 實(shí)體類型,。

clip_image003 圖 2 BlogPost 實(shí)體類型定義

<EntityType Name="BlogPost">
   <Key>
      <PropertyRef Name="BlogPostID" />
   </Key>
   <Property Name="BlogPostID" Type="Int32" Nullable="false" />
   <Property Name="BlogEntry" Type="String" Nullable="false" MaxLength="Max" 
             Unicode="true" FixedLength="false" />
   <Property Name="BlogDate" Type="DateTime" Nullable="false" />
   <Property Name="BlogTitle" Type="String" Nullable="false" MaxLength="500" 
             Unicode="true" FixedLength="false" />
   <Property Name="BlogType" Type="Int32" Nullable="false" />
   <Property Name="CityVisited" Type="String" MaxLength="200"
             Unicode="true" FixedLength="false" />
   <Property Name="CountryVisited" Type="String" MaxLength="200" Unicode="true" 
             FixedLength="false" />
   <Property Name="DateVisited" Type="DateTime" />
 
   <NavigationProperty Name="Blog" Relationship=
                       "MyTravelPostModel.FK_BlogPosts_Blogs"
                       FromRole="BlogPosts" ToRole="Blogs" />
   <NavigationProperty Name="Pictures" Relationship=
                       "MyTravelPostModel.FK_Pictures_BlogPosts"
                       FromRole="BlogPosts" ToRole="Pictures" />
   <NavigationProperty Name="Comments" Relationship=
                       "MyTravelPostModel.BlogComments"
                       FromRole="BlogPosts" ToRole="Comments" />
</EntityType>

實(shí)體類型的屬性可以是基元類型或復(fù)雜類型(請(qǐng)參閱圖 3),,但在 Entity Framework 1.0 中,它們不能是基元或復(fù)雜類型的其他實(shí)體類型或集合,。實(shí)體類型的關(guān)鍵字由這些屬性的子集組成,。導(dǎo)航屬性允許導(dǎo)航從一個(gè)實(shí)體到另一實(shí)體的關(guān)系,。

clip_image003[1] 圖 3 解決復(fù)雜類型定義

<ComplexType Name="Address">
    <Property Name="StreetAddress"
              Type="String" MaxLength="50" />
    <Property Name="Address2"
              Type="String" MaxLength="50" />
    <Property Name="City"
              Type="String" MaxLength="50" />
    <Property Name="Region"
              Type="String" MaxLength="50" />
    <Property Name="PostalCode"
              Type="String" MaxLength="50" />
    <Property Name="Country"
              Type="String" MaxLength="50" />
</ComplexType>

如之前所介紹的,關(guān)系可以作為某個(gè)關(guān)系參與方的各實(shí)體類型的導(dǎo)航屬性,。關(guān)系本身是 EDM 中的一等公民并且在 EDM 中明確定義為關(guān)聯(lián):

<Association Name="FK_Friends_People">
   <End Role="People" Type="MyTravelPostModel.Person" Multiplicity="1" />
   <End Role="Friends" Type="MyTravelPostModel.Friend" Multiplicity="*" />
   <ReferentialConstraint>
      <Principal Role="People">
         <PropertyRef Name="PersonID" />
      </Principal>
      <Dependent Role="Friends">
         <PropertyRef Name="PrimaryPersonID" />
      </Dependent>
   </ReferentialConstraint>
</Association>

因此簡(jiǎn)言之,,我們?yōu)槭裁匆紫葎?chuàng)建一種新的數(shù)據(jù)建模技術(shù)?盡管在 EDM 之前就存在許多數(shù)據(jù)建模技術(shù)或語(yǔ)言,,但沒(méi)有一個(gè)能滿足 Microsoft 想要實(shí)現(xiàn)的主要目標(biāo),,也沒(méi)有一個(gè)能使經(jīng)常使用的實(shí)體關(guān)系模型變?yōu)榭蓤?zhí)行模型。團(tuán)隊(duì)曾研究了大量現(xiàn)有的數(shù)據(jù)建模技術(shù),,但最后發(fā)現(xiàn)它們都專門針對(duì)或強(qiáng)調(diào)特定的 問(wèn)題領(lǐng)域,,因此不得不重新開發(fā) EDM 來(lái)創(chuàng)建一種新模型,以滿足這些目標(biāo)并能夠真正用作開發(fā)人員和服務(wù)器技術(shù)套件的核心數(shù)據(jù)模型,。

為什么使用 XML 來(lái)描述 EDM,?

經(jīng)過(guò)認(rèn)真考慮后,XML 被選作 EDM 的第一個(gè)序列表示,。通過(guò)生成 XML 文件(或資源)或從動(dòng)態(tài)生成的 XML 表示中加載,,開發(fā)人員和第三方可以利用經(jīng)過(guò)良好定義的 XML 格式來(lái)進(jìn)行此類格式的轉(zhuǎn)換以及將其加載到實(shí)體框架的元數(shù)據(jù)運(yùn)行時(shí)中。但是,,創(chuàng)建 EDM 的其他表示也是完全可能的,,而且很可能隨著產(chǎn)品的發(fā)展在未來(lái)版本中就會(huì)出現(xiàn)其他替代表示。

當(dāng)前的 EDM 語(yǔ)法是使用產(chǎn)品隨附的 XML 架構(gòu)定義語(yǔ)言 (XSD) 定義的,。但是,,不應(yīng)期望大多數(shù)人都會(huì)采用手動(dòng)開發(fā) XML 的方式,而應(yīng)認(rèn)為人們會(huì)使用 Visual Studio 中提供的工具,。也就是說(shuō),團(tuán)隊(duì)已知曉大家對(duì)特定于域的語(yǔ)言 (DSL) 以及對(duì) EDM 模型備用持久性機(jī)制(通常針對(duì)數(shù)據(jù)庫(kù)而言)的關(guān)注,,并且正在對(duì)這些選項(xiàng)做評(píng)估以便在即將發(fā)行的版本中進(jìn)行擴(kuò)展,。

誰(shuí)需要另一種新的查詢語(yǔ)言?

有關(guān) EDM 開發(fā)的最后一個(gè)問(wèn)題是為什么要?jiǎng)?chuàng)建一種新的查詢語(yǔ)言,?為什么不使用現(xiàn)有的語(yǔ)言,?在稍微深入地研究一個(gè) EDM 后,答案就會(huì)變得清晰起來(lái),。

到目前為止,,我已經(jīng)介紹了為什么要?jiǎng)?chuàng)建 EDM 以及 EDM 中使用的各種構(gòu)造,還介紹了這樣一個(gè)事實(shí),,即該模型是實(shí)體關(guān)系模型的后代,。為了使創(chuàng)建的模型不但能夠清楚地映射到底層數(shù)據(jù)存儲(chǔ),而且還可以表現(xiàn)開發(fā)人員編 程時(shí)所依據(jù)的應(yīng)用程序級(jí)的域模型,,EDM 需要能夠?qū)Ω鞣N概念(如繼承和多態(tài)性)進(jìn)行建模,。由于當(dāng)前的關(guān)系查詢語(yǔ)言并不支持基于繼承,、關(guān)系導(dǎo)航或多態(tài)結(jié)果的返回值進(jìn)行查詢,因此需要開發(fā)一種新的查 詢語(yǔ)言來(lái)滿足此需求,。

這就催生了實(shí)體 SQL (ESQL),,它是一種新的 SQL 語(yǔ)言,其中加入了之前的 SQL 語(yǔ)言并不支持的基于概念的查詢功能,。ESQL 擴(kuò)展現(xiàn)有 SQL 語(yǔ)言的方式與 EDM 擴(kuò)展數(shù)據(jù)庫(kù)中所使用的關(guān)系模型的方式十分類似,。此外,ESQL 未綁定到任何特定于后臺(tái)數(shù)據(jù)庫(kù)的語(yǔ)法,,因此可一次性編寫查詢(和/或應(yīng)用程序),,無(wú)論針對(duì)的是哪個(gè)后臺(tái)數(shù)據(jù)庫(kù)都無(wú)影響。下面我將以一個(gè)簡(jiǎn)單的 ESQL 查詢?yōu)槔?,說(shuō)明如何從全部博客中檢索至少具有一篇帖子和關(guān)聯(lián)人員(在我的模型中是指博客所有者)的博客:

select c, c.Person 
  from travelEntitiesGeneral.Blogs as c 
  where c.BlogPosts.Count > 0

實(shí)現(xiàn) EDM

ADO.NET Entity Framework 是由 ADO.NET 演變而來(lái)的,,是 EDM 的首個(gè)具體實(shí)現(xiàn),可在開發(fā)關(guān)系數(shù)據(jù)庫(kù)時(shí)提供較高級(jí)別的抽象,。在版本 1.0 中,,團(tuán)隊(duì)一直側(cè)重于構(gòu)建平臺(tái)基礎(chǔ),而不僅僅是一個(gè)簡(jiǎn)單的 ORM,,這將允許開發(fā)人員使用非常靈活的映射來(lái)處理概念模型或?qū)ο竽P?,并能夠適應(yīng)與底層存儲(chǔ)之間存在的巨大分別。

這一高度的靈活性以及與底層存儲(chǔ)的巨大分別是允許數(shù)據(jù)庫(kù)和應(yīng)用程序分別發(fā)展的關(guān)鍵所在,。當(dāng)數(shù)據(jù)庫(kù)架構(gòu)發(fā)生改變時(shí),,應(yīng)用程序由于采用實(shí)體框架而不必進(jìn)行改動(dòng),并且您通常不需要重新編寫應(yīng)用程序的內(nèi)容,,只是在必要時(shí)更新映射文件以適應(yīng)此變化即可,。

為了開始發(fā)展 ADO.NET 平臺(tái),需要以現(xiàn)有 ADO.NET 2.0 提供程序模型為基礎(chǔ)構(gòu)建實(shí)體框架,,并對(duì)現(xiàn)有提供程序進(jìn)行適當(dāng)更新以支持新的實(shí)體框架和 ADO.NET 3.5 功能,。我們之所以選擇在現(xiàn)有 ADO.NET 提供程序模型的基礎(chǔ)上來(lái)實(shí)現(xiàn)是為了確保開發(fā)社區(qū)對(duì)提供程序模型不會(huì)感到陌生。

體系結(jié)構(gòu)如圖 4 所示,。您會(huì)注意到可接受的架構(gòu)包括概念架構(gòu)定義語(yǔ)言 (CSDL),、映射架構(gòu)語(yǔ)言以及存儲(chǔ)架構(gòu)定義語(yǔ)言 (SSDL)。您還會(huì)注意到,,實(shí)體框架包括了更新后的支持規(guī)范命令樹 (CCT) 的 SqlClient 數(shù)據(jù)提供程序,。

clip_image005

圖 4 ADO.NET Entity Framework 體系結(jié)構(gòu)

EntityClient

然后,實(shí)體框架在這些 ADO.NET 3.5 提供程序的基礎(chǔ)上引入新的 ADO.NET 提供程序 EntityClient,。Entity­Client 看上去與之前使用的 ADO.NET 提供程序非常類似,,它將提供第一個(gè)抽象,可允許開發(fā)人員使用標(biāo)準(zhǔn)的 Connection,、Command 和 DataReader 對(duì)象依照 EDM 執(zhí)行查詢,。它還會(huì)將映射域模型所需的客戶端視圖引擎(根據(jù) EDM 定義的)添加到底層關(guān)系數(shù)據(jù)庫(kù)架構(gòu),。必要時(shí),,EntityClient 可借助 ESQL 查詢字符串讓開發(fā)人員以行和列的形式處理實(shí)體,,而不必生成類來(lái)表示概念架構(gòu)。

如果看一看圖 5 中的 EntityClient,,您會(huì)注意到我創(chuàng)建了一個(gè)包含 ESQL 查詢字符串的 EntityCommand,,該命令隨后會(huì)在我的 EDM 中被執(zhí)行。作為 EntityCommand 的一部分而提供的查詢文本被解析并會(huì)創(chuàng)建一個(gè) CCT,。

clip_image003[2] 圖 5 使用 ESQL 執(zhí)行針對(duì) EntityClient 的查詢

using (EntityConnection conn = new 
         EntityConnection("name=travelEntitiesGeneral"))
{
      conn.Open();
      EntityCommand cmd = conn.CreateCommand();
      cmd.CommandText = @"select c.BlogID 
         from travelEntitiesGeneral.Blogs as c 
         where c.BlogPosts.Count > 0";
      EntityDataReader reader = 
         cmd.ExecuteReader(CommandBehavior.SequentialAccess);
      while (reader.Read())
      {
         Console.WriteLine("BlogID = {0}", reader["BlogID"]);
      }
     conn.Close();
}

在這第一個(gè)階段中,,命令樹仍針對(duì) EDM 來(lái)表示,。客戶端視圖引擎借鑒數(shù)據(jù)庫(kù)系統(tǒng)中的具體化視圖理論并將這些理論應(yīng)用到數(shù)據(jù)訪問(wèn)層,,它在樹中應(yīng)用了一個(gè)映射轉(zhuǎn)換,可生成一個(gè)在底層邏輯存儲(chǔ)模型方面 表示相同操作的樹,,并刪除任何非關(guān)系概念(如關(guān)系、繼承和多態(tài)性),。這一新轉(zhuǎn)換的樹被傳給 ADO.NET 3.5 提供程序服務(wù),,而此服務(wù)會(huì)返回封裝底層存儲(chǔ)的本機(jī) SQL 的 DbCommand 命令,然后此命令被執(zhí)行,,其結(jié)果通過(guò)堆棧向上回傳,。

在定義客戶端視圖引擎中所使用的映射以便在 EDM 和邏輯數(shù)據(jù)庫(kù)架構(gòu)之間進(jìn)行轉(zhuǎn)換時(shí),可采用多種不同的方法,。此映射可使用映射規(guī)范語(yǔ)言 (MSL) 來(lái)指定,這是一種聲明性的 XML 語(yǔ)法,,可通過(guò)手動(dòng)編寫 XML 或使用 Visual Studio 中包括的實(shí)體映射工具進(jìn)行創(chuàng)建和編輯(請(qǐng)參閱圖 6),。

clip_image003[3] 圖 6 MSL—EntitySetMapping 示例

<EntitySetMapping Name="BlogPosts">
   <EntityTypeMapping TypeName="IsTypeOf(MyTravelPostModel.BlogPost)">
      <MappingFragment StoreEntitySet="BlogPosts">
         <ScalarProperty Name="BlogPostID" ColumnName="BlogPostID" />
         <ScalarProperty Name="BlogEntry" ColumnName="BlogEntry" />
         <ScalarProperty Name="BlogDate" ColumnName="BlogDate" />
         <ScalarProperty Name="BlogTitle" ColumnName="BlogTitle" />
         <ScalarProperty Name="BlogType" ColumnName="BlogType" />
         <ScalarProperty Name="CityVisited" ColumnName="CityVisited" />
         <ScalarProperty Name="CountryVisited" 
                         ColumnName="CountryVisited" />
         <ScalarProperty Name="DateVisited" ColumnName="DateVisited" />
      </MappingFragment>
   </EntityTypeMapping>
</EntitySetMapping>

編譯時(shí),,MSL 允許實(shí)體框架生成必要的查詢并更新視圖,,這些視圖隨后會(huì)在客戶端視圖引擎中被用來(lái)完成從查詢(利用 EDM 定義的)到邏輯存儲(chǔ)架構(gòu)的轉(zhuǎn)換,。

另一種用于表達(dá)映射或部分映射的方法是使用 ESQL 查詢,。在這種情況下,,當(dāng)開發(fā)人員使用 ESQL 來(lái)表達(dá)查詢視圖時(shí),基礎(chǔ)結(jié)構(gòu)會(huì)要求他們?cè)谟成湟?guī)范中同時(shí)定義伴隨的 Create,、Update 和 Delete 映射。此操作是必需的,,因?yàn)槿绻軌蛟?#8220;查詢視圖”中利用 ESQL 功能,,從而可以為沒(méi)有單個(gè)有效更新視圖的查詢定義視圖,則映射基礎(chǔ)結(jié)構(gòu)將無(wú)法為查詢生成對(duì)應(yīng)的更新視圖,。

對(duì)象服務(wù)

在 EntityClient 提供程序的基礎(chǔ)上,,實(shí)體框架添加了另一組抽象,,以便允許針對(duì)對(duì)象而非 EntityClient 返回的非類型化數(shù)據(jù)記錄進(jìn)行開發(fā),。這就是通常被認(rèn)為是 ORM 的層,它可以生成在數(shù)據(jù)模型中所定義類型的 CLR 實(shí)例并允許開發(fā)人員使用 LINQ 或 ESQL 查詢這些對(duì)象,。它也恰好是當(dāng)初眾多開發(fā)人員在市場(chǎng)中尋找可用的 ORM 技術(shù)時(shí)最能吸引他們眼球的實(shí)體框架層,。

正如圖 1 所示,對(duì)象服務(wù)層的高級(jí)功能是接受來(lái)自應(yīng)用程序的 ESQL 或 LINQ 查詢,,然后將查詢表達(dá)式傳遞給下面的 EntityClient 并返回 IEnumerable<T>,。但是,經(jīng)過(guò)深入的分析后您會(huì)發(fā)現(xiàn),,對(duì)象服務(wù)層的中心是代表應(yīng)用程序與底層數(shù)據(jù)存儲(chǔ)之間的交互會(huì)話的 ObjectContext,。

ObjectContext 是開發(fā)人員在查詢、添加和刪除其實(shí)體實(shí)例以及將新狀態(tài)保存回?cái)?shù)據(jù)庫(kù)時(shí)用到的主要構(gòu)造,。圖 7 顯示的是實(shí)體的創(chuàng)建以及使用 ObjectContext 對(duì)實(shí)體執(zhí)行查詢,、操作以及 SaveChanges 等動(dòng)作。此示例使用 ESQL 作為查詢語(yǔ)言,。

clip_image003[4] 圖 7 使用 ObjectContext

using (ObjectContext context = new ObjectContext("name=travelEntities"))
    {
        //--- create a query for customers
        ObjectQuery<Person> personQuery = context.CreateQuery<Person>(
                     @"select value c from travelEntitiesGeneral.People 
                     as c where c.PersonID == 1");
        //--- by enumerating the query will be implicitly executed
        //--- against the store and you can now work with an
        //--- IEnumerable<Customer>
        foreach (Person c in personQuery)
        {
            //--- dereference anything you like from Customer
            Console.WriteLine(c.PersonID + ": " + c.Name);
            c.Name = "New Name";
        }
        try
        {
            context.SaveChanges();
        }
        catch (OptimisticConcurrencyException opt)
        {
            // catching this exception allows you to 
            // refresh travelEntities with either store/client wins
            // project the travelEntities into this failed travelEntities.
            var failedEntities = from e3 in opt.StateEntries
                                 select new { e3.Entity };
 
            // Note: in future you should be able to just pass 
            // the opt.StateEntities  
            // in to refresh.
            context.Refresh(RefreshMode.ClientWins, failedEntities.ToList());
            context.SaveChanges();
        }
    } 

如果使用對(duì)象服務(wù),,則對(duì)開發(fā)人員而言,跟蹤內(nèi)存中對(duì)象所發(fā)生的更改的流程以及將這些更改保存回?cái)?shù)據(jù)庫(kù)的流程都會(huì)得到簡(jiǎn)化,。對(duì)象服務(wù)使用 ObjectStateManager 不但會(huì)跟蹤內(nèi)存中實(shí)例的當(dāng)前狀態(tài),,還會(huì)跟蹤每個(gè)實(shí)例從存儲(chǔ)庫(kù)中檢索出來(lái)時(shí)的初始狀態(tài),從而使實(shí)體框架可以在將數(shù)據(jù)推送回?cái)?shù)據(jù)庫(kù)時(shí)應(yīng)用最優(yōu)的并發(fā)操作,。通過(guò) 對(duì) ObjectContext 調(diào)用 SaveChanges 方法,,可以輕松地保存所跟蹤的更改并將其推送回?cái)?shù)據(jù)存儲(chǔ)庫(kù)。

到目前為止,我一直在講述有關(guān) ObjectContext 的基本內(nèi)容并通過(guò)一些示例介紹 Object­Context 的基本用法,,它通常用于有動(dòng)態(tài)工具或應(yīng)用程序需要使用 EDM 模型的情形,。但是,在使用 Visual Studio 作為開發(fā)環(huán)境時(shí),,開發(fā)人員發(fā)現(xiàn)強(qiáng)類型化 ObjectContext 還有一個(gè)優(yōu)點(diǎn),,即可以向可能特定于目標(biāo) EDM 的表面功能添加屬性和方法。

圖 8 顯示了使用強(qiáng)類型化 Object­Context 構(gòu)建的查詢,。此示例演示了如何使用 LINQ 作為查詢語(yǔ)言,。使用強(qiáng)類型化 ObjectContext 可公開每個(gè) EntitySet 的屬性,從而使其更容易被發(fā)現(xiàn),;例如,,使用 travel­Entities.BlogPosts 而非 travelEntities.CreateQuery<Blog­Post> ("travelEntitiesGeneral.BlogPosts")。

clip_image003[5] 圖 8 使用強(qiáng)類型化 ObjectContext 構(gòu)建的查詢

using (MyTravelPostEntities travelEntities = new MyTravelPostEntities())
{
    // get the latest blog post, with the comments and the people
    // I'm querying for all the blog posts that are related to this blog.
    // I want to include the comments and the people who wrote the
    // comments.
    // I also want only the most recent posting.
    // Note: Since we use the EntityKey that is put on the EntityReference
    // we can either do a tracking query or use span.
    BlogPost post = (from bp in 
        travelEntities.BlogPosts
                              .Include("Comments.Person")
                              .Include("Blog")
                     where bp.Blog.BlogID == requestedBlog.BlogID
                     orderby bp.BlogDate descending
                     select bp).First();
    return post;
} 

LINQ to Entities 是作為對(duì)象服務(wù)上一個(gè)非常薄的層出現(xiàn)的,,它在編程語(yǔ)言中提供直接的查詢功能(請(qǐng)參閱圖 8) 而非使用基于字符串的查詢,。在這種情況下,ObjectQuery 類將實(shí)現(xiàn) Iqueryable,,允許它接受 LINQ 表達(dá)式樹,,并采用對(duì)象服務(wù)在將 ESQL 查詢傳遞到 Entity­Client 提供程序時(shí)所使用的同樣方式在實(shí)例框架中推動(dòng)查詢(作為 CCT 查詢表達(dá)式)。

使用實(shí)體框架進(jìn)行 N 層開發(fā)

盡管本文的主要目標(biāo)并非是全面介紹 n 層開發(fā),,但作為實(shí)體框架開發(fā)過(guò)程中一個(gè)比較有趣的環(huán)節(jié),,對(duì)此還是應(yīng)該有所提及。在版本 1.0 中,,實(shí)體框架在許多主要方案中都支持 n 層開發(fā),。其中包括使用 ADO.NET 數(shù)據(jù)服務(wù)或使用 Windows® Communication Foundation (WCF),它們都具有序列化實(shí)體以及在 ObjectContext 中附加/分離實(shí)體的功能,。這些顯然并非是實(shí)現(xiàn) n 層開發(fā)的唯一方法,;但是,它們是團(tuán)隊(duì)在 V1 中重點(diǎn)關(guān)注的解決方案,,而且在 V2 和更高的版本中還添加了更多其他方案(如更接近數(shù)據(jù)集的體驗(yàn)),。圖 9 展示了我所講述的內(nèi)容。

clip_image003[6] 圖 9 N 層應(yīng)用程序中的 ADO.NET 數(shù)據(jù)服務(wù)

static Uri baseService = new 
   Uri("http://localhost:17338/MyTravelPostService.svc");
MyPeople2Entities context = new MyPeople2Entities(baseService); 
    // get the comment that is being marked for deletion
    // and get the view state blog post.
BlogPost post = (BlogPost)ViewState["BlogPost"];
 
    // move the comment to the deleted comment selection. 
Comment deletedComment = post.Comments[e.RowIndex];
 
    // call the DeleteComment service
context.AttachTo("Comments", deletedComment);
context.DeleteObject(deletedComment);
DataServiceResponse r = context.SaveChanges();
 
    // reload page so that F5, refresh doesn't update all this data.
ReloadPage();

ADO.NET 數(shù)據(jù)服務(wù)是具像狀態(tài)傳輸 (REST) 體系結(jié)構(gòu)風(fēng)格的一個(gè)具體實(shí)現(xiàn)(每種資源都代表系統(tǒng)中的一個(gè)名詞 — 即一個(gè)可以通過(guò)統(tǒng)一資源標(biāo)識(shí)符 (URI) 唯一標(biāo)識(shí)的事物),,它允許在任意 IQueryable 實(shí)現(xiàn)上進(jìn)行 n 層應(yīng)用程序的開發(fā),。利用 ADO.NET 數(shù)據(jù)服務(wù),除了通過(guò)線路查詢實(shí)例以外,,您還可以實(shí)現(xiàn)更多功能,。ADO.NET 數(shù)據(jù)服務(wù)支持 Create、Read,、Update 和 Delete 等各種 HTTP 動(dòng)詞,并提供客戶端抽象來(lái)幫助開發(fā)人員實(shí)現(xiàn)其解決方案,。

n 層方案的第二種方法是使用具有實(shí)體框架的 WCF,,以便充分利用序列化實(shí)體以及在 ObjectContext 中附加/分離實(shí)體的能力,。圖 10 展示了在此方案中如何附加到 ObjectContext。

clip_image003[7] 圖 10 附加到 ObjectContext

 
// the creation of the travel MyTravelPostEntities opens the connection 
// and sets up all the metadata information automatically for you.
using (MyTravelPostEntities travelEntities = new MyTravelPostEntities())
{
    // attach the comment and delete.
    travelEntities.Attach(deleteComment);
 
    // call delete on the object
    travelEntities.DeleteObject(deleteComment);
 
    try
    {
       travelEntities.SaveChanges();
    }
    catch (OptimisticConcurrencyException opt)
    {
      // catching this exception allows you to 
      // refresh travelEntities with either store/client wins
      // project the travelEntities into this failed travelEntities.
      var failedEntities = from e3 in opt.StateEntries
                           select new { e3.Entity };
 
     travelEntities.Refresh(RefreshMode.ClientWins, failedEntities.ToList());
     travelEntities.SaveChanges();
    }
}

默認(rèn)情況下,,無(wú)論是從 Visual Studio 中的 EDM 生成的還是使用 edmgen.exe(實(shí)體框架隨附的命令行工具)生成的 CLR 類都是 XML 可序列化和二進(jìn)制可序列化的,,并且是導(dǎo)航屬性默認(rèn)設(shè)置為 DataMembers 的數(shù)據(jù)約定,因而可以創(chuàng)建 ASMX Web 服務(wù)并在視圖狀態(tài)或 WCF 服務(wù)中使用實(shí)體實(shí)例,。

與大多數(shù) ORM 類似,,實(shí)體框架目前并不支持使用數(shù)據(jù)操作語(yǔ)言 (DML) 進(jìn)行創(chuàng)建、更新或刪除等操作,。必須將更改應(yīng)用到內(nèi)存中的對(duì)象,,并且在構(gòu)建要保持的整個(gè)圖表時(shí)可能需要與數(shù)據(jù)庫(kù)進(jìn)行多次交互。

可用來(lái)避免這一過(guò)程的一種方法是使用 ObjectContext 提供的附加功能,。您可以利用 Attach 來(lái)通知基礎(chǔ)結(jié)構(gòu),,告知它實(shí)體已經(jīng)存在,應(yīng)該在內(nèi)存中執(zhí)行一組操作然后將更改向下推送,。如需有關(guān)使用實(shí)體框架實(shí)現(xiàn) n 層開發(fā)的更多信息,,請(qǐng)搜索 MSDN® 庫(kù),因?yàn)楹芸炀蜁?huì)向其中添加更多內(nèi)容,。

只是另一個(gè) ORM,?

到目前為止,許多人都只是將實(shí)體框架看作是市場(chǎng)中的另一個(gè) ORM,,如果只看本產(chǎn)品的第一個(gè)版本,,那么有這種想法也不足為奇。但從該角度來(lái)看,,產(chǎn)品此時(shí)所具有的功能已經(jīng)可以實(shí)現(xiàn) ORM 剛剛開始著手解決的一組核心方案,。不過(guò),目前的許多分析也指出,,實(shí)體框架并不能完全涵蓋市場(chǎng)中其他一些 ORM 所提供的全部功能,,這也的確是實(shí)情。

Microsoft 在此領(lǐng)域所做的投資旨在擴(kuò)展傳統(tǒng) ORM 產(chǎn)品的功能,,而實(shí)體框架(我將在稍后介紹)正是圍繞 EDM 所展開的更廣泛策略的第一個(gè)步驟,。正如我在本文開頭所提到的,EDM 創(chuàng)建了一個(gè)較高級(jí)別的域模型,,其適用范圍遠(yuǎn)遠(yuǎn)超出了實(shí)體框架和傳統(tǒng)的 ORM,。預(yù)計(jì)在未來(lái)幾個(gè)版本的 Microsoft .NET Framework、Visual Studio,、SQL Server® 以及其他 Microsoft 技術(shù)中,,EDM 的身影會(huì)越來(lái)越多地出現(xiàn)在其中。

此預(yù)期以及 EDM 發(fā)展的整體愿景已成為最主要的推動(dòng)力(正如本文所討論的各種產(chǎn)品決策中所展示的那樣)。各種決策在制定時(shí)都應(yīng)盡可能確保能被各種技術(shù)(如 Reporting Services 和 Analysis Services)所采用,。這將為客戶帶來(lái)極大的好處,,因?yàn)楦鞣N服務(wù)都將可以在常見(jiàn)且一致的域模型中提供。

第一個(gè)成為現(xiàn)實(shí)的愿景是 ADO.NET 數(shù)據(jù)服務(wù)將在 Visual Studio 2008 SP1 中與實(shí)體框架一起發(fā)布,。ADO.NET 數(shù)據(jù)服務(wù)為基于 REST 的應(yīng)用程序提供了值得關(guān)注的開發(fā)人員體驗(yàn),,它將成為使用 EDM 作為元數(shù)據(jù)交換格式構(gòu)建的首個(gè)產(chǎn)品(在實(shí)體框架以外)。

為配合此次發(fā)布行動(dòng),,Microsoft 在 MIX 2008 中展示了各種與眾不同的 Windows Live™ 屬性,,它們都使用 ADO.NET 數(shù)據(jù)服務(wù)協(xié)議和 EDM 提供其數(shù)據(jù)。同樣,,當(dāng)我們開始規(guī)劃下一版本的 SQL Server 和 Visual Studio 時(shí),,團(tuán)隊(duì)將以 EDM 和實(shí)體框架為核心,努力提供更好的端對(duì)端開發(fā)體驗(yàn),。

Elisa Flasko 是 Microsoft 數(shù)據(jù)可編程性團(tuán)隊(duì)的一名項(xiàng)目經(jīng)理,,主要從事 ADO.NET、XML 和 SQL Server 連接性技術(shù)的研究,。您可以通過(guò)她的博客 blogs./elisaj 與其聯(lián)系,。

 

 

 

C# 3.0推出一些新的特性,比如Extension Method, Lambda Expression, Anonymous Type,,其實(shí)這些新特性都是用來(lái)為L(zhǎng)inq服務(wù),。Linq To SQL將程序員從以往寫大量的sql查詢語(yǔ)句、取值,、賦值中解放出來(lái),,在intellisense和編譯上做了很多工作,使得這些查詢能夠在編譯期進(jìn)行檢 查,。同時(shí)微軟推出ADO.NET Entity Framework,,即下一代的ADO.NET。它是比Linq To SQL更加強(qiáng)大的ORM,,讓開發(fā)人員只需要著眼于領(lǐng)域?qū)ο竽P偷拈_發(fā),,而不需要考慮它們是如何與關(guān)系數(shù)據(jù)庫(kù)交互。

本文由一個(gè)簡(jiǎn)單的例子進(jìn)行介紹Entity Framework是如何使用的,。在此之前,,必須下載ADO.NET Entity Framework runtimetools,官方也提供了很多示例下載,。下面正式開始ADO.NET Entity Framework之旅(開發(fā)工具VS 2008 beta,,以Northiwind數(shù)據(jù)庫(kù)為例)。

首先建立一個(gè)Console project(要選擇.NET Framework 3.5),,然后點(diǎn)擊Add New Item,,看見(jiàn)ADO.NET Entity Data Model選項(xiàng):

clip_image002

然后會(huì)出現(xiàn)Wizard,,選擇數(shù)據(jù)庫(kù),選擇表,、視圖,、存儲(chǔ)過(guò)程等,按照向?qū)б徊讲絹?lái)就可以了,,在這里只選擇Customers和Orders表。在 Solution Explore視圖里面點(diǎn)擊Northwind.edmx,,可以看到Entity的信息(看上去很像Linq To SQL的dbml設(shè)計(jì)視圖),,然后將它們改名為Customer和Order。

clip_image004

現(xiàn)在我們就可以進(jìn)行查詢了,,先引用命名空間:

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);

}

}

接著來(lái)查詢某個(gè)Customer,,

Customer alfki = ctx.Customers.Where("it.CustomerID = 'ALFKI'").First();

"it.CustomerID = 'ALFKI'"表示查詢條件語(yǔ)句,,該語(yǔ)句看著又像C#代碼又像SQL,被成為Entity SQL Language,,具體語(yǔ)法在幫助文檔上有很詳細(xì)的Reference,。

這里也可以使用Linq進(jìn)行查詢(Linq To Entities),需要引用System.Linq命名空間,,似乎Entity Framework不支持Single方法,,會(huì)拋出異常。

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中進(jìn)行一對(duì)多的查詢很簡(jiǎn)單,,但是值得注意的是Entity Framework默認(rèn)是Lazy Load,,即關(guān)聯(lián)數(shù)據(jù)在需要的時(shí)候才加載。

在本例子中,,如果直接查詢?cè)揅ustomer關(guān)聯(lián)的orders,,查詢不到結(jié)果。

foreach (var order in alfki.Orders)

{

Console.WriteLine(order.OrderID);

}

需要在使用orders之前調(diào)用 alfki.Orders.Load(),, 再次運(yùn)行便可以得到正確的結(jié)果,。

這篇文章主要介紹在ADO.NET實(shí)體框架中如何進(jìn)行查詢(以Northwind數(shù)據(jù)庫(kù)為例)。

1. 使用EntityCommand進(jìn)行查詢

在實(shí)體框架中,,我們可以通過(guò)EntityCommand進(jìn)行查詢,,它的使用方法就像ADO.NET中的SqlCommand。不同的是SqlCommand使用標(biāo)準(zhǔn)SQL語(yǔ)句對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢,,而EntityCommand使用Entity SQL對(duì)EntityContainer進(jìn)行查詢,,當(dāng)然最終實(shí)體框架會(huì)將Entity SQL轉(zhuǎn)換成標(biāo)準(zhǔn)SQL語(yǔ)句查詢數(shù)據(jù)庫(kù)。

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"]);

}

}

首先是建立一個(gè)EntityConnection,,它接受一個(gè)參數(shù),,表明使用的是在config文件中的哪個(gè)連接字符串,。

<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>

可以看到這個(gè)連接字符串和以往ADO.NET中使用的連接字符串并不一樣。metadata:指明.csdl/.ssdl/.msl三個(gè)文件的路徑,,這三個(gè)文件的作用以后再做說(shuō)明,。provider:表示使用的是SqlClient或者Oledb或者Odbc。provider connection string:這一項(xiàng)便是以往所用的連接字符串,。providerName表示現(xiàn)在用的是EntityClient,。

接著構(gòu)造EntityCommand,最后通過(guò)EntityDataReader進(jìn)行數(shù)據(jù)的讀取,,值得注意的是這里的EntityCommand接受的是Entity SQL語(yǔ)句,,而不是標(biāo)準(zhǔn)SQL語(yǔ)句,具體的Entity SQL語(yǔ)法可以參考幫助文檔,。

2. 使用ObjectQuery進(jìn)行查詢

實(shí)體框架提供一個(gè)名為ObjectQuery的類,,它讓開發(fā)人員通過(guò)Entity SQL進(jìn)行查詢,查詢結(jié)果以對(duì)象的形式供使用,。

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);

}

}

首先調(diào)用CreateQuery方法來(lái)創(chuàng)建ObjectQuery對(duì)象(當(dāng)然這里也可以使用new,,只是傳進(jìn)的參數(shù)不同而已),它接受Entity SQL語(yǔ)句作為參數(shù),。然后調(diào)用Execute方法進(jìn)行查詢,,它接受MergeOption枚舉型的參數(shù),表示解決沖突的方法,。查詢結(jié)果以對(duì)象的形式(這里 是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自動(dòng)生成Entities和各個(gè)對(duì)象的代碼,幫助開發(fā)人員減少了很多體力活,。這樣,,我們可以簡(jiǎn)單寫成:

using (NorthwindEntities ctx = new NorthwindEntities())

{

foreach (Customer c in ctx.Customers)

{

Console.WriteLine("ID [{0}], ContactTitle [{1}]",

c.CustomerID, c.ContactTitle);

}

}

其實(shí)這里,也是使用ObjectQuery來(lái)進(jìn)行查詢,。當(dāng)然,,可以給查詢加上更多的條件,在上一篇文章中也有說(shuō)明這里就不寫了,。

值得關(guān)注的是:自動(dòng)生成的實(shí)體類中有這樣一個(gè)方法,,比如Customer:

public static Customer CreateCustomer(string customerID, string companyName)

{

Customer customer = new Customer();

customer.CustomerID = customerID;

customer.CompanyName = companyName;

return customer;

}

并不像以前一樣,提供帶參數(shù)的構(gòu)造函數(shù),,而是提供CreateCustomer的靜態(tài)方法來(lái)構(gòu)造Customer實(shí)例,。這似乎和前一段時(shí)候貧血充血的問(wèn)題有關(guān)了,實(shí)體對(duì)象該不該有行為,,是貧血還是充血,?雖然只是一個(gè)方法,不過(guò)相信這也表明了微軟的態(tài)度吧,。

ADO.NET Entity Framework 入門示例向?qū)Вǜ紻emo程序下載)

ADO.NET Entity Framework 是.Net Framework 3.5 SP1 引入的實(shí)體框架,,它使開發(fā)人員可以通過(guò)對(duì)象模型(而不是邏輯/關(guān)系數(shù)據(jù)模型)專注于數(shù)據(jù),。實(shí)體框架Entity Framework使用概念層、映射層和邏輯層將邏輯數(shù)據(jù)庫(kù)結(jié)構(gòu)抽象化,。

實(shí)體數(shù)據(jù)模型(Entity Data Model)

實(shí)體框架的核心位于其模型中,。實(shí)體框架支持表示數(shù)據(jù)庫(kù)中的關(guān)系架構(gòu)的邏輯存儲(chǔ)模型。關(guān)系數(shù)據(jù)庫(kù)通常存儲(chǔ)數(shù)據(jù)的方式與應(yīng)用程序使用數(shù)據(jù)的方式不同,。通 常,,這會(huì)迫使開發(fā)人員按照數(shù)據(jù)庫(kù)包含數(shù)據(jù)的結(jié)構(gòu)檢索數(shù)據(jù)。因此,,開發(fā)人員通常將數(shù)據(jù)加載到更適合處理業(yè)務(wù)規(guī)則的業(yè)務(wù)實(shí)體中,。在本示例中,以邏輯模型表示關(guān) 系數(shù)據(jù)庫(kù)的構(gòu)架,,業(yè)務(wù)實(shí)體表示概念模型。實(shí)體框架使用映射層在模型之間搭建了橋梁,。因此,,實(shí)體框架的模型中有三個(gè)處于活動(dòng)狀態(tài)的層:

1.    概念層(Conceptual layer) - 表示數(shù)據(jù)的概念模型,包括實(shí)體和相互關(guān)系,。

2.    邏輯層(Logical layer)- 描述數(shù)據(jù)在數(shù)據(jù)庫(kù)的存儲(chǔ)模型,。

3.    映射層(Mapping layer) - 在概念層和邏輯層模型之間建立映射。

這三層允許將數(shù)據(jù)從關(guān)系數(shù)據(jù)庫(kù)映射到更加面向?qū)ο蟮臉I(yè)務(wù)模型,。實(shí)體框架提供了使用 XML 文件定義這些層的方法,。它還基于概念模型的架構(gòu)生成了一系列類??梢葬槍?duì)這些類進(jìn)行編程以直接與數(shù)據(jù)交互,。這提供了抽象級(jí)別,因此開發(fā)人員可以針對(duì)概念模型而不是關(guān)系模型進(jìn)行編程,。

下面演示如何使用Entity Framework 構(gòu)建示例程序,。

首先,使用Entity Data Model Wizard創(chuàng)建如下NorthwindDB.edml文件,。

概念模型和邏輯模型視圖:

本示例程序采用Northwind 示例數(shù)據(jù)庫(kù),,下面開始編寫代碼對(duì)Customers表進(jìn)行增、刪,、改,、查等等操作。

1.新增Customers記錄

using (NorthwindEntities myDb = new NorthwindEntities())

            {

Customers customer = new Customers();

Random rm = new Random();

                customer.CustomerID = "A" + rm.Next(9999).ToString();

                customer.CompanyName = "EntLib.com Forum";

                customer.Address = "http://www.EntLib.com";

                myDb.AddToCustomers(customer);

int count = myDb.SaveChanges();

                txtCustomerID.Text = customer.CustomerID;

            }

2.更新Customers記錄

using (NorthwindEntities myDb = new NorthwindEntities())

            {

var query = from customer in myDb.Customers

where customer.CustomerID == txtCustomerID.Text.Trim()

select customer;

foreach (var row in query)

                {

                    row.CompanyName = "Updated Company Name";

                }

                myDb.SaveChanges();

            }

3.刪除Customers記錄

using (NorthwindEntities myDb = new NorthwindEntities())

            {

var query = from customer in myDb.Customers

where customer.CustomerID == txtCustomerID.Text.Trim()

select customer;

foreach (var row in query)

                {

                    myDb.DeleteObject(row);

                }

                myDb.SaveChanges();

            }

4.查詢Customers,,返回所有記錄

using (NorthwindEntities myDb = new NorthwindEntities())

            {

                dataGridView1.DataSource = myDb.Customers;

            }

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多