@Justin と @Petro の回答に感謝します。私が思いついた解決策は、あなたが提案したテクニックの組み合わせです。以下で説明するソリューションは、テストの実行ごとに新しいデータベースを提供し、テストごとに個別のトランザクションを提供します。
テスト プロジェクトの App.config にテスト データベースの接続文字列を追加しました。
<connectionStrings>
<add name ="TestDatabase"
providerName="System.Data.SqlClient"
connectionString="Data Source=(LocalDb)\v11.0;Database=TestDatabase;Integrated Security=True"/>
</connectionStrings>
セットアップとティアダウンを提供するために、統合テストの基本クラスを作成しました。セットアップはコンテキストをインスタンス化し、DB がまだ存在しない場合は作成し、トランザクションを開始します。Teardown はトランザクションをロールバックします。
public class EntityFrameworkIntegrationTest
{
protected MyDbContext DbContext;
protected TransactionScope TransactionScope;
[TestInitialize]
public void TestSetup()
{
DbContext = new MyDbContext(TestInit.TestDatabaseName);
DbContext.Database.CreateIfNotExists();
TransactionScope = new TransactionScope(TransactionScopeOption.RequiresNew);
}
[TestCleanup]
public void TestCleanup()
{
TransactionScope.Dispose();
}
}
最後に、すべてのテストの実行後にデータベースを削除するクラスがあります。
[TestClass]
public static class TestInit
{
// Maps to connection string in App.config
public const string TestDatabaseName = "TestDatabase";
[AssemblyCleanup]
public static void AssemblyCleanup()
{
Database.Delete(TestDatabaseName);
}
}
Entity Framework に関するこのブログ投稿は、Entity Framework が内部で/慣習的に行っていることをより深く理解するのに役立つことがわかったことを付け加えておきます。