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

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

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

      說說IUnitOfWork~方法完整性與統一提交不沖突

      回到目錄

      第一講 認識IUnitOfWork,為什么要出現IUnitOfWork接口
      第二講 Linq to Sql與EntityFrameworks中的SubmtChanges()發生了什么事
      第三講 方法完整性與統一提交不沖突
      第四講 DbContext對象的創建應該向BLL層公開
      第五講 我的IUnitOfWork+Repository架構
       

          在一個方法中,它一般會做一件事情,這樣的方法在功能上比較清晰,在職責上也很單一(這里的單一是褒義的,呵呵),而它所做的這件事,從頭到尾會把它做完,不會做到一半的功能,這屬于功能上的不完整,這不是我們推薦的。

      項目中的代碼:

      完整的提交方法:

              protected virtual void SaveChanges()
              {
                  if (!iUnitWork.IsNotSubmit)
                      iUnitWork.Save();
              }

      完整的插入方法:

             public virtual void Add(TEntity item)
              {
                  _db.Entry<TEntity>(item);
                  _db.Set<TEntity>().Add(item);
                  this.SaveChanges();
              }

      上面代碼是EF實現的插入,很完善,將實現添加到實體集合,并使用SaveChanges()提交到數據庫,一個完善的數據插入流程完成,但一個問題來了如果我們的

      業務操作不只是插入一張表,還有更新另一張表,怎么去實現呢?

             public virtual void Modify(TEntity item)
              {
                  _db.Set<TEntity>().Attach(item);
                  _db.Entry(item).State = EntityState.Modified;
                  this.SaveChanges();
              }

      上面為完整的更新動作是上面的代碼,現在有一個假設:

      UserRepository類有方法Add,ProductRepository類有方法Modify,這時,這兩個方法進行組織,代碼可能是這樣:

      ...code

      userRepository.Add(user);

      userRepository.Modify(product);

      ...code

            事實上,上面的代碼所執行的過程為:先插入用戶表,提交到SQL數據庫,再更新產品表,再提交到SQL數據庫,這時由于提交兩次,SQL端會產生兩個連接池,而如果兩個方法使用了TransactionScope事務塊,并且SQL服務器與WWW服務器在不同的電腦上,會觸發多于的分布式事務(這是可以避免的),而我們知道,windows的MSDTC(分布式事務)服務是最不靠譜的

      如何解決這種情況呢,難道方法不該完整嗎?

      什么事情都有解決的辦法,方法的完整性在系統設計上是沒有問題的,但有時,對于一個工作單元中有多個方法時,我們需要把這種完整性升級,將多個方法提升為一個整體,即多個方法的完整性問題,解決這個問題的關鍵在于,你的數據上下文是否為一個,你的submitChanges方法是否為一個。

      IUnitWork嶄新的接口規范

          /// <summary>
          /// 工作單元
          /// 提供一個保存方法,它可以對調用層公開,為了減少連庫次數
          /// </summary>
          public interface IUnitOfWork
          {
              /// <summary>
              /// 將操作提交到數據庫,
              /// </summary>
              void Save();
              /// <summary>
              /// 是否不提交到數據庫,這只是在具體的repository類中的SaveChanges方法里用到的
              /// 默認為false,即默認為提交到數據庫
              /// </summary>
              /// <returns></returns>
              bool IsNotSubmit { get; set; }
          }
      
          /// <summary>
          /// 工作單元
          /// 對泛型類型的支持
          /// </summary>
          /// <typeparam name="T"></typeparam>
          public interface IUnitWork<T> : IUnitOfWork where T : class { }

      看了上面的接口,不用我說,大家也知道其中的含義了,Save()為數據上下文提交,而IsNotSubmit表示是否要提交到數據庫,我們都知道bool類型對象的默認

      值不false,所以,默認情況下,Add,Modify這些方法的提交動作都是true,即被提交到數據庫。

      我們優化這時上面add與modify的方法如下:

      Domain.Core.IUnitOfWork _iUnitWork = new backgroundEntities();
       _iUnitWork.IsNotSubmit=true;
      userRepository(user);
      productRepository(product); 
      _iUnitWork.Save();

      OK, 上面的代碼所產生的效果就是,將兩條SQL語句發到SQL端 ,使用一個SQL連接池,不產生MSDTC服務。

      回到目錄

      posted @ 2013-03-18 22:06  張占嶺  閱讀(3305)  評論(2)    收藏  舉報
      主站蜘蛛池模板: 偷拍久久大胆的黄片视频| 精品国产av一区二区果冻传媒| 国产尤物精品自在拍视频首页 | 国产欧美日韩高清在线不卡 | 忘忧草日本在线播放www| 国产黄色一区二区三区四区| 欧美白妞大战非洲大炮| 久久三级中文欧大战字幕| A毛片终身免费观看网站| 亚洲欧美日韩综合一区在线 | 欧美性猛交xxxx乱大交丰满| 人人色在线视频播放| 亚洲乱码中文字幕小综合| 精品人妻中文字幕av| 秋霞A级毛片在线看| 国产成人综合久久亚洲精品| 免费的特黄特色大片| 精品少妇后入一区二区三区| 欧美黑人添添高潮a片www| 亚洲精国产一区二区三区| 在国产线视频A在线视频| 国产高潮刺激叫喊视频| 精品国产污污免费网站入口| 久久精品国产亚洲av麻豆小说 | 亚洲电影在线观看| 农村妇女野外一区二区视频| 亚洲国产欧美一区二区好看电影| 国产99视频精品免费视频36| 99精品国产一区二区三区| 成人国产精品免费网站| 久久九九久精品国产免费直播| 秭归县| 日韩无专区精品中文字幕| 日本一区二区三区专线| 久久月本道色综合久久| 亚洲综合小综合中文字幕| 日韩人妻少妇一区二区三区| 久久亚洲日本激情战少妇| 中文字幕成人精品久久不卡| 久久精品国产99国产精品澳门| 亚洲国产精品日韩av专区|