首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架中一个事务中的多个数据库

实体框架中一个事务中的多个数据库
EN

Stack Overflow用户
提问于 2013-12-09 10:27:24
回答 3查看 10.2K关注 0票数 3

我在实体框架中为两个不同的数据库创建了两个不同的上下文。现在,我试图在单个事务中更新这些数据库。我的代码是这样的

代码语言:javascript
复制
public class LPO_BLL
{
    internal Context1 _context1 = null;
    internal Context2 _Context2 = null;

    public LPO_Detail_BLL(Context1 context1, Context2 context2)
    {
        _context1 = context1;
        _context2 = context2;
    }

    public void Insert(PM_LPO lpo, LPO_Transaction lpo_transaction)
    {
        using (TransactionScope transaction = new TransactionScope())
        {
            _context1.LPO.Add(lpo);
            _context1.SaveChanges();

            _context2.LPO_Transaction.Add(lpo_transaction);
            _context2.SaveChanges();  // I am getting error here...

            transaction.Complete();
        }
    }
}

在UI项目中,我称之为:

代码语言:javascript
复制
LPO lpo = new LPO();
//setting properties of lpo

LPO_Transaction lpo_trans = new LPO_Transaction();
//setting properties of lpo_trans

Context1 _context1 = new Context1();
//Opening _context1 connection and etc

Context2 _context2 = new Context2();
//Opening _context2 connection and etc

LPO_BLL lpo_bll = new LPO_BLL(_context1, _context2);

lpo_bll.Insert(lpo,lpo_trans);

目前,我遇到了错误:底层提供者EnlistTransaction失败了

在互联网上搜索了3个小时,尝试了不同的攻击和测试方法之后,我决定把它戴上。到目前为止,我发现这两个联系有点接近:

http://social.msdn.microsoft.com/Forums/en-US/3ccac6f7-6513-4c87-828a-00e0b88285bc/the-underlying-provider-failed-on-enlisttransaction?forum=adodotnetentityframework

TransactionScope - The underlying provider failed on EnlistTransaction. MSDTC being aborted

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-09 10:40:47

并非所有DB提供程序都支持分布式事务。

使用事务作用域将尝试在MSDTC管理的分布式事务处理中登记DB事务。如果您的提供者不支持这一点,它将失败。

Server和Oracle提供程序支持分布式事务。但许多其他EF供应商却不这么做。

如果您的DB提供程序支持这一点,您将不得不使用另一个或放弃使用事务。

如果您使用的是Server 2005,则它应该可以工作,但是:

  • MSDTC服务必须正在运行(在“控制面板”中的“服务”中查找它)。
  • 连接字符串必须足以使MSDTC工作。

看看this SO Q&A: confusion about transactions and msdtc

注意:服务的名称是MSDTC。这样您就可以运行net start msdtcnet stop msdtc。如果您在控制面板中查找它,您将找到一个描述性名称,如“分布式事务协调器”或本地化名称,如“协调员de transacciones distribuidas”。奇怪的是,无法在本地服务的控制面板列表中显示name列。

票数 5
EN

Stack Overflow用户

发布于 2015-06-17 15:54:26

为了在参数中使用ObjectContext,必须在DbContext中使用SaveChanges:

代码语言:javascript
复制
public class EntityDBContext: DbContext, IObjectContextAdapter
{
    ObjectContext IObjectContextAdapter.ObjectContext {
        get { 
           return (this as IObjectContextAdapter).ObjectContext;
        }
    }
}

然后在插入方法中,使用:

代码语言:javascript
复制
public void Insert(PM_LPO lpo, LPO_Transaction lpo_transaction)
{
    using (TransactionScope transaction = new TransactionScope())
    {

         context1.ObjectContext.SaveChanges(false);
         context2.ObjectContext.SaveChanges(false);

         _context1.LPO.Add(lpo);
         _context2.LPO_Transaction.Add(lpo_transaction);       

         transaction.Complete();

         context1.ObjectContext.AcceptAllChanges();
         context2.ObjectContext.AcceptAllChanges();

    }
}
票数 2
EN

Stack Overflow用户

发布于 2013-12-09 11:23:34

对于多个数据库,应该使用Savechange(false)和AcceptAllChanges()。

代码语言:javascript
复制
 public void Insert(PM_LPO lpo, LPO_Transaction lpo_transaction)
{
    using (TransactionScope transaction = new TransactionScope())
    {

         context1.SaveChanges(false);
         context2.SaveChanges(false);

        _context1.LPO.Add(lpo);
        _context2.LPO_Transaction.Add(lpo_transaction);       

        transaction.Complete();

       context1.AcceptAllChanges();
       context2.AcceptAllChanges();

    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20468245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档