<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      冠軍

      導(dǎo)航

      Entity Framework 4.1 之八:繞過 EF 查詢映射

      原文名稱:Entity Framework 4.1: Bypassing EF query mapping (8)

      原文地址:http://vincentlauzon.wordpress.com/2011/04/21/entity-framework-4-1-bypassing-ef-query-mapping-8/

      看到 Entity Framework 4.1 推薦英文教程,為了幫大家看起來方便一些,簡(jiǎn)單翻譯一下。這是一個(gè)系列,共有 8 篇,這是第 8 篇。
       
      1. Entity Framework 4.1 之一 : 基礎(chǔ)
      2. Entity Framework 4.1 之二 : 覆蓋默認(rèn)的約定
      3. Entity Framework 4.1 之三 : 貪婪加載和延遲加載
      4. Entity Framework 4.1 之四:復(fù)雜類型
      5. Entity Framework 4.1 之五:多對(duì)多的關(guān)系
      6. Entity Framework 4.1 之六:樂觀并發(fā)
      7. Entity Framework 4.1 之七:繼承
      8. Entity Framework 4.1 之八:繞過 EF 查詢映射

      這是這了系列的最后一篇,我將討論如何繞過 EF 的查詢映射。

      像所有優(yōu)秀的框架一樣,EF 知道它并不能優(yōu)秀到覆蓋所有的角落,通過允許直接訪問數(shù)據(jù)庫(kù),EF 支持開放底層的 ADO.NET 框架。

      有三個(gè) API 支持:

      • DbContext.Database.ExecuteSqlCommand
      • DbContext.Database.SqlQuery
      • DbSet.SqlQuery

      第一個(gè)沒有什么特別,就像典型的 ADO.NET 中的 SqlCommand。

      publicint ExecuteSqlCommand(string sql, paramsobject[] parameters);

      第二個(gè)有點(diǎn)意思。

      public IEnumerable<TElement> SqlQuery<TElement>(string sql, paramsobject[] parameters);

      我們可以使用這個(gè)方法直接將 SQL 命令發(fā)送到數(shù)據(jù)庫(kù),不管是存儲(chǔ)過程,還是臨時(shí)的 SQL。與 ADO.NET 的區(qū)別在于它能夠?qū)⒉樵兘Y(jié)果的 DataReader 中的數(shù)據(jù)直接轉(zhuǎn)換為實(shí)體對(duì)象。

      TElement 可以是任何類。重要的是 EF 不會(huì)跟蹤返回的對(duì)象,即使他們真的是實(shí)體類型的對(duì)象。這與第三個(gè) DbSet 不同,第三種方式會(huì)跟蹤返回的對(duì)象。

      讓我們?cè)囈幌?DbContext.Database.SqlQuery:

      public IEnumerable<SprocReport> GetEntityList()
      {
      return Database.SqlQuery<SprocReport>("SELECT LegalEntityBaseID, EntityName FROM dbo.LegalEntity");
      }

      一個(gè)最佳實(shí)踐就是在 DbContext 的派生類中封裝這些調(diào)用。下面是我們使用的 SprocReport 類的定義。

      publicclass SprocReport
      {
      publicint LegalEntityBaseID { get; set; }
      publicstring EntityName { get; set; }
      }

      這個(gè)類不是實(shí)體,而且屬性被直接映射:不能控制映射。即使你使用復(fù)雜類型,并且覆蓋了映射,這些覆蓋也不會(huì)起作用。

      現(xiàn)在看 DbSet.SqlQuery,這個(gè)方法返回的實(shí)體將會(huì)被 EF 跟蹤修改,所以,如果你在這些返回的實(shí)體上做了修改,當(dāng) DbContext.SaveChanges 被調(diào)用的時(shí)候,將會(huì)被處理。從另一個(gè)方面來說,也不能覆蓋列的映射。

      另外一個(gè)旁路 EF 映射管理的方法是使用 Entity SQL,記住 EF 將實(shí)體模型映射到物理的模型,在轉(zhuǎn)換到本地底層的數(shù)據(jù)存儲(chǔ)(例如 TSQL) 查詢之前,先將  LINQ 查詢被轉(zhuǎn)化到實(shí)體模型上(通過 eSQL 語法)。

      舉例來說,我們可以創(chuàng)建實(shí)體集而不需要在 DbContex 中定義:

      protectedoverridevoid OnModelCreating(DbModelBuilder modelBuilder)
      {
      base.OnModelCreating(modelBuilder);

      modelBuilder.Entity
      <SimpleEntry>().HasEntitySetName("MyEntry");
      modelBuilder.Entity
      <SimpleEntry>().ToTable("MyEntry", "man");
      modelBuilder.Entity
      <SimpleEntry>()
      .Property(s
      => s.ID)
      .HasColumnName(
      "SimpleEntryID");
      modelBuilder.Entity
      <SimpleEntry>()
      .Property(s
      => s.Name)
      .HasColumnName(
      "SimpleEntryName");

      }

      然后,我們可以暴露出查詢:

      public IEnumerable<SimpleEntry> GetSimpleEntries()
      {
      IObjectContextAdapter adapter
      =this;
      var entries
      = adapter.ObjectContext.CreateQuery<SimpleEntry>("SELECT VALUE MyEntry FROM MyEntry");

      return entries;
      }

      這里我們使用底層的 ObjectContext 以便查詢。這種方式比直接將 SQL 發(fā)送到數(shù)據(jù)庫(kù)的優(yōu)勢(shì)在于,我們可以使用 LINQ 在其上進(jìn)行查詢,最終發(fā)送到數(shù)據(jù)庫(kù)的 SQL 是合并得到的。因此,我們可以通過從一個(gè)返回任何結(jié)果的簡(jiǎn)單查詢開始,然后在其上應(yīng)用 LINQ來得到有效的查詢,而不需要在使用方查詢整個(gè)表。

      為了說服我們自己,我剛剛說的是真的,讓我們?cè)囈幌隆?/p>

      public IEnumerable<SimpleEntry> GetSimpleEntries()
      {
      IObjectContextAdapter adapter
      =this;
      var entries
      = adapter.ObjectContext.CreateQuery<SimpleEntry>("SELECT VALUE MyEntry FROM MyEntry");
      var final
      = from e in entries
      where e.Name == "Mark"
      select e;
      var f
      = (System.Data.Objects.ObjectQuery<SimpleEntry>)final;
      var s
      = f.ToTraceString();

      return entries;
      }

      如果輸出 s 的值,可以看到:

      SELECT
      [Extent1].[SimpleEntryID]AS[SimpleEntryID],
      [Extent1].[SimpleEntryName]AS[SimpleEntryName]
      FROM[man].[MyEntry]AS[Extent1]
      WHERE N’Mark’ = [Extent1].[SimpleEntryName]

      這是 EF 生成的典型的 TSQL, 你會(huì)注意到 LINQ 過濾條件被應(yīng)用到了 SQL 語句中。

      現(xiàn)在,如果你希望能夠截獲實(shí)體的 Insert, Update, 和 Delete 操作,就要靠你自己了。你需要重寫 DbContext.SaveChanges ,獲取特定狀態(tài)的實(shí)體,實(shí)現(xiàn)自己的數(shù)據(jù)操作邏輯來保存修改,然后在調(diào)用 base.SaveChanges 之前將這些實(shí)體的狀態(tài)切換到 Unmodified 。這可以用,但這是一種特殊的技巧。

      posted on 2011-05-09 10:59  冠軍  閱讀(19934)  評(píng)論(10)    收藏  舉報(bào)

      主站蜘蛛池模板: 越南女子杂交内射bbwxz| 亚洲欧美人成人让影院| 黄陵县| 高清免费毛片| 国产福利酱国产一区二区| 成人国产精品中文字幕| 亚洲人ⅴsaⅴ国产精品| 一区二区三区在线色视频| 中文字幕av国产精品| 欧美福利电影A在线播放| 亚洲精品成人综合色在线| 免青青草免费观看视频在线| 中文字幕av无码一区二区蜜芽三区| 无码一区二区三区免费| 精品女同一区二区三区在线| 国产中文字幕日韩精品| gogogo高清在线观看视频中文| av天堂久久精品影音先锋| 精品亚洲无人区一区二区| 久久中文字幕日韩无码视频| 被灌满精子的波多野结衣| 91精品亚洲一区二区三区| 蜜臀av无码一区二区三区| 免费网站看V片在线毛| 国产精品亚洲综合色区丝瓜| 欧美和黑人xxxx猛交视频| 成人免费ā片在线观看| 国产成人精品永久免费视频| 成人无码潮喷在线观看| 中文字幕av日韩有码| 久久国产精品精品国产色婷婷| 日韩免费无码人妻波多野| 国产最大的福利精品自拍| 99精品热在线在线观看视| 国产综合色产在线视频欧美| 性色av不卡一区二区三区| 99精品国产成人一区二区| 欧洲精品码一区二区三区| 国产卡一卡二卡三免费入口| 99精品国产综合久久久久五月天| 国产亚洲精品久久久久久久软件 |