Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 多个EF数据库可以避免MSDTC吗?_.net_Sql Server_Entity Framework_Transactionscope_Msdtc - Fatal编程技术网

.net 多个EF数据库可以避免MSDTC吗?

.net 多个EF数据库可以避免MSDTC吗?,.net,sql-server,entity-framework,transactionscope,msdtc,.net,Sql Server,Entity Framework,Transactionscope,Msdtc,我有两个SQL Server数据库(具有不同的表)和一个实体框架DbContext,它表示其中的每一个。这些上下文中的每个表都将作为业务流程的一部分进行修改。在流程结束时,我希望使用一个事务来确保保存所有内容,或者什么都不保存。到目前为止,我唯一能做到这一点的方法是使用类似以下的代码: using (var scope = new TransactionScope(TransactionScopeOption.Required)) { DataMgr.EFAccount.SaveC

我有两个SQL Server数据库(具有不同的表)和一个实体框架DbContext,它表示其中的每一个。这些上下文中的每个表都将作为业务流程的一部分进行修改。在流程结束时,我希望使用一个事务来确保保存所有内容,或者什么都不保存。到目前为止,我唯一能做到这一点的方法是使用类似以下的代码:

using (var scope = new TransactionScope(TransactionScopeOption.Required))
{   
    DataMgr.EFAccount.SaveChanges();
    DataMgr.EFCompany.SaveChanges();
    scope.Complete();
}
不幸的是,这段代码使用了MSDTC,这导致了我非常想避免的额外性能损失。我听说,如果您对所有数据库更新使用相同的连接,就可以摆脱MSDTC。但是,这些DbContext中的每一个都有自己到数据库的连接,因此我无法找到在创建DbContext后更改其连接的方法


有人知道在这种情况下我可以避免MSDTC的方法吗?我们使用的是EF 6.0、.NET framework 4.5.2和SQL Server 2012。我们目前正在首先使用数据库,但这种情况可能会改变。

您看到了吗?在我的例子中,DbContext是在这段代码之前创建的,所以他们使用的方法可能不起作用。我将在创建时向我的Dbcontext传递一个已经存在的连接(到另一个数据库),但我并不乐观。正如我所怀疑的,在创建时传递一个连接对象(从另一个数据库上下文)在这种情况下不起作用。您可以很好地创建DbContext,但是如果您尝试使用它做任何事情,它将给您一个错误。问题是,数据库第一个连接字符串传入了DbConext所依赖的许多特定于数据库的信息(csdl、ssdl等),如果去掉这些信息,问题就会发生。此方法可能适用于代码优先EF设置,但不适用于数据库优先设置。我将应用程序切换为“代码优先”,将连接传递到新上下文对我不起作用。第二个上下文找不到它需要的表,因为连接指向第一个数据库。看到了吗?在我的例子中,DbContext是在这段代码之前创建的,所以他们使用的方法可能不起作用。我将在创建时向我的Dbcontext传递一个已经存在的连接(到另一个数据库),但我并不乐观。正如我所怀疑的,在创建时传递一个连接对象(从另一个数据库上下文)在这种情况下不起作用。您可以很好地创建DbContext,但是如果您尝试使用它做任何事情,它将给您一个错误。问题是,数据库第一个连接字符串传入了DbConext所依赖的许多特定于数据库的信息(csdl、ssdl等),如果去掉这些信息,问题就会发生。此方法可能适用于代码优先EF设置,但不适用于数据库优先设置。我将应用程序切换为“代码优先”,将连接传递到新上下文对我不起作用。第二个上下文找不到它需要的表,因为连接指向第一个数据库。