我有一个使用 EnterpriseLibrary 和 Unity 的应用程序,并且只在一个地方使用 TransactionScope。这很好用,尽管它是针对 SQL Server 2005 运行的:
// Execute a stored proc using a DbDatabase object inserted by Unity
using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
// Update something using the same DbDatabase object
// Run the stored proc above, again
// Assert that the results are different than from the previous call.
}
是的,这故意在没有scope.Complete()
: 的情况下结束:示例来自测试。
我还有一个刚刚开始的应用程序。它使用实体框架 4.1。它访问同一服务器上的同一数据库。我尝试使用TransactionScope
,并牢记相同的“进行更改,验证更改,回滚更改”的想法。
using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
using(ProjectEntities db = new ProjectEntities())
{
Assert.IsFalse(db.tblEntities.Any(e=>e.X == desired_value));
db.tblEntities.Add(new tblEntity() { X = desired_value });
db.SaveChanges();
Assert.IsTrue(db.tblEntities.Any(e=> e.X == desired_value));
}
}
这将失败,并出现非常熟悉的错误,即未启用 MSDTC 进行网络访问。
现在,这一分钟,第一个项目中的第一个测试成功,第二个测试失败。
所以我有两个问题:
有没有办法重新调整我的第二个测试,以防止事务升级到 MSDTC?
有人知道为什么我从这两个框架中得到不同的结果吗?EntLib 是否在整个使用期间保持分配和打开单个连接?EF做相反的事情吗?