在 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。