从业务逻辑层使用带有 EntityFramework 的事务

Posted

技术标签:

【中文标题】从业务逻辑层使用带有 EntityFramework 的事务【英文标题】:Using Transactions with EntityFramework FROM the business logic layer 【发布时间】:2012-05-08 06:19:24 【问题描述】:

请先看看这个: Good Coding Practices

所以,这是我的设计。

    网站 2.业务逻辑层 3.DALFacade(我们使用dalfacade来隐藏数据访问,因为我们使用了2个不同的store,sql和db2) 4.DAL

在 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 将不会读取事务中的任何内容,但如果在保存更改时不存在,它将创建新事务。

在您的代码中,您只保存了事务中的更改,但您在阅读时应该小心,并且您还应该将查询封装在更小的单元中。

【讨论】:

以上是关于从业务逻辑层使用带有 EntityFramework 的事务的主要内容,如果未能解决你的问题,请参考以下文章

如果我从控制器中取出逻辑,是不是需要业务逻辑层?

在单独的数据访问和业务逻辑层中,我可以在业务层中使用实体框架类吗?

从数据访问层拉出业务逻辑

3层架构业务逻辑层无逻辑

将数据访问逻辑从业务层移至数据访问层

从业务逻辑向 UI 发布消息