我的情况是我有2个数据库。
经理有公司表,根据这个值,我必须创建一个新的数据库。
所以我使用的是TransactionScope。我想知道以下是正确的吗?
这会回滚这两个变化吗?在两个DB中如果发生错误?
using (TransactionScope ts = new TransactionScope())
{
try
{
using(var ManagerContext = new ManagerEntities(
ConnectionStringManager.GetManagerConnectionString()))
{
//Operations on Manager DB
// Create new Company and get NEWCOMPANYID
// -- Used to create new DB
}
using(var companyContext = new CompanyEntities(
ConnectionStringManager.GetCompanyConnectionString(
NEWCOMPANYID.ToString())))
{
//Create New Company DB
}
ts.Complete();
}
catch (Exception ex)
{
ts.Dispose();
}
}
答案 0 :(得分:2)
只要这两个数据库上下文都TransactionScope
知道,并且没有显式禁用环境事务(例如,在连接字符串中),那么是:那应该可以正常工作。如果我们假设两个连接字符串不同,那么肯定需要分布式事务(DTC),但是这是否正常取决于您。如果连接字符串相同,则可以改为使用LTM(减少开销/配置)。
请注意,根据评论,您不需要try
/ finally
。
答案 1 :(得分:2)
这没关系,虽然它会触发DTC,正如Marc所解释的那样。您可以使用两个上下文共享的单个SqlConnection
(或EntityConnection
)来避免DTC。您可以使用ChangeDatabase
切换连接的当前数据库。这避免了对分布式事务的需求。
您还需要显式打开连接,因为默认情况下EF会打开并为每个操作关闭它。这导致多个DTC登记(超过2个)。这是EF的设计缺陷。