ADO.NET Entity Framework 學習(2)

作者: 紫色陰影  發布時間: 2008-08-31 23:54  閱讀: 1028 次  推薦: 0   原文鏈接   [收藏]  

  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=&quot;Data Source=localhost\sqlexpress;Initial Catalog=Northwind;Integrated Security=True&quot;" 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實例。這似乎和前一段時候貧血充血的問題有關了,實體對象該不該有行為,是貧血還是充血?雖然只是一個方法,不過相信這也表明了微軟的態度吧。

0
0
 
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()