Visual Studio 2008、C#、Entity Framework 3.5、MS Test には、次の 2 つのテストがあります。
[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();
}
}
}
それらを個別に実行すると、両方とも合格します。しかし、すべてのテストを実行すると、2 番目のテストで次のように表示されます。
System.InvalidOperationException: 2 つのオブジェクトが異なる ObjectContext オブジェクトに関連付けられているため、2 つのオブジェクト間の関係を定義できません。
私はこれをまったく理解していません。コードパスのどこにも新しいエンティティ オブジェクトを作成しません。私は何度かチェックしました(そして、コードが個々のテスト実行と本番環境での使用でどのように機能するかを見て、それは真実でなければなりません)。さらに、エンティティを 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
。