2012-05-08 11 views
0

PLSのは、最初にこれを参照してください。 Good Coding Practices使用したトランザクションは

だから、これは私のデザインです。

  1. サイト 2.Businessロジック層 3.DALFacadeで 4.DAL

(我々は2つの異なる店舗、SQLおよびDB2を使用しているため、我々は、データへのアクセスを非表示にするdalfacadeを使用) DALでは作業単位パターンとリポジトリパターンを使用しています。 1.ここで大きな問題は次のとおりです。ビジネスロジックから作成されたトランザクションに対して、以下のコードが正常に実行される場合。

Page: 

public partial class NewBonusRequest : System.Web.UI.Page 
{ 

    #region Constructor and Instantiation of Business Logic 
     /// <summary> 
     /// Property that holds the Business Logic type to call methods 
     /// </summary> 
     public IRequestBL RequestBL { get; private set; } 

     /// <summary> 
     /// The default constructor will use the default implementation of the business logic interface 
     /// </summary> 
     public Request() 
      : this(new RequestBL()) 
     { 
     } 

     /// <summary> 
     /// The constructor accepts a IEcoBonusRequestFacade type 
     /// </summary> 
     /// <param name="ecoBonusRequestBL">IEcoBonusRequestFacade type</param> 
     public NewRequest(IRequestBL RequestBL) 
     { 
      RequestBL = RequestBL; 
     } 
    #endregion 


    protected void PageLoad(object sender, EventArgs e) 
    { 
     if(!Page.IsPostBack) 
     { 

     } 
    } 


    #region Control Events 
     protected void BtnSubmitRequestClick(object sender, EventArgs e) 
     { 
      var request= new Request 
             { 
              IsOnHold = true 
              //All other properties go here. 
             }; 

      RequestBL.Save(request); 
     } 



    Business Logic Code. 

    public interface IRequestBL 
    { 
     void Save(Request request); 
    } 

    /// <summary> 
    /// Class in charge of the business logic for EcoBonusRequest 
    /// </summary> 
    public class RequestBL : IRequestBL 
    { 
     /// <summary> 


     /// <summary> 
     /// Saves a new ecobonus request into database and evaluate business rules here 
     /// </summary> 
     /// <param name="ecoBonusWorkflow">EcoBonusWorkflow entity</param> 
     public void Save(Request Request) 
     { 
      using (var scope = new TransactionScope()) 
      { 
       Request.Save(request); 
       // Call to other DALCFacade methods that insert data in different tables 
       // OtherObject.Save(otherobject) 
       scope.Complete(); 
      } 
     } 
    } 

答えて

1

同じスレッドでは、EFは存在する場合はトランザクションスコープを適切に考慮します。 EFはすでに新しいトランザクションを作成しません。

ただし、トランザクションなしでデータベースにクエリを実行すると、ダーティリードが発生するため、注意する必要があります。 EFは存在しない場合はトランザクション内の何も読み取らないため、変更の保存中に存在しない場合は新しいトランザクションを作成します。

あなたのコードでは、トランザクションの変更を保存するだけですが、読んでいる間は細心の注意を払う必要があります。また、クエリをより小さな単位でカプセル化する必要があります。

関連する問題