在 Visual Studio 2008、C#、Entity Framework 3.5、MS Test 中,我有两个测试:
[TestMethod]
public void Test1()
{
using (Entities context = new Entities())
{
using (TransactionHelper transaction = new TransactionHelper(context))
{
// Stuff
transaction.Rollback();
}
}
}
和:
[TestMethod]
public void Test2()
{
using (Entities context = new Entities())
{
using (TransactionHelper transaction = new TransactionHelper(context))
{
// Stuff
transaction.Rollback();
}
}
}
单独运行它们时,它们都通过了。但是当我运行所有测试时,第二个测试会显示以下内容:
System.InvalidOperationException:无法定义两个对象之间的关系,因为它们附加到不同的 ObjectContext 对象。
我完全不明白这一点。我没有在代码路径中创建新的实体对象。我检查了几次(并且看到代码在单独的测试运行和生产使用中是如何工作的,这一定是真的)。我什至将实体包装在 using 语句中。
TestContext 中是否有一些奇怪的保留?
作为参考,TransactionHelper(简化):
public class TransactionHelper : IDisposable
{
private global::System.Data.Objects.ObjectContext _context;
private ConnectionState _initialConState;
private DbTransaction _transaction;
public TransactionHelper(global::System.Data.Objects.ObjectContext context)
{
_context = context;
_initialConState = context.Connection.State;
if (_initialConState != ConnectionState.Open)
{
_context.Connection.Open(); // open connection if not already open
}
_transaction = _context.Connection.BeginTransaction(IsolationLevel.ReadUncommitted);
}
public void Rollback()
{
_transaction.Rollback();
}
public void Commit()
{
_transaction.Commit();
}
public void Dispose()
{
_transaction.Dispose();
if (_initialConState != ConnectionState.Open)
{
_context.Connection.Close(); // only close connection if not initially open
}
}
}
如果我使用隔离级别没有区别ReadCommitted
。