1

エンティティ フレームワーク テスト用のデータベースを作成しようとしていますが、構成ファイルを正しく読み取ることができません。テスト プロジェクトの私のapp.configファイルは次のようになります。

<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="TestConnection"
         connectionString= "Data Source=(LocalDb)\v11.0;
                            Initial Catalog=LocabalTestDB;
                            Integrated Security=SSPI;
                            MultipleActiveResultSets=true"
         providerName="System.Data.SqlClient" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
  ....
</configuration>

ただし、 というデータベースを作成するのではなく、 というデータベースをLocabalTestDB作成していますLocabal.Model.LocabalSqlContext。接続文字列は次のようになります。

"データ ソース=(localdb)\v11.0;初期カタログ=Local.Model.LocalSqlContext;統合セキュリティ=True;MultipleActiveResultSets=True;アプリケーション名=EntityFrameworkMUE"

DB 作成/シード コードは次のようになります (テストを実行する前に 1 回実行されます)。

    [AssemblyInitialize]
    public static void Init(TestContext c)
    {
        Database.SetInitializer<LocabalSqlContext>(null);

        using (var db = new LocabalSqlContext())
        {
            if (!db.Database.Exists())
            {
                db.Database.Create();
                Locabal.Model.Migrations.Configuration.SeedData(db);
            }
        }
    }
4

1 に答える 1

2

このMSDN の記事から、接続文字列の名前を の名前に設定する必要がありますDbContext。その後、「初期カタログ」パラメーターが DB 名になります。例えば:

  <connectionStrings>
    <add name="LocabalSqlContext"
         connectionString= "Data Source=(LocalDb)\v11.0;
                            Initial Catalog=LocabalTestDB;
                            Integrated Security=SSPI;
                            MultipleActiveResultSets=true"
         providerName="System.Data.SqlClient" />
  </connectionStrings>

次に、次のようにテスト クラスを設定できます。

public class TestDBSeeder : DropCreateDatabaseIfModelChanges<LocabalSqlContext>
{
    protected override void Seed(LocabalSqlContext context)
    {
        Locabal.Model.Migrations.Configuration.SeedData(context);
        base.Seed(context);
    }
}

[TestClass]
public class LocabalSqlContextIntegrationBaseTest
{
    protected TransactionScope Transaction { get; set; }

    [AssemblyInitialize]
    public static void Init(TestContext c)
    {
        Database.SetInitializer<LocabalSqlContext>(new TestDBSeeder());

        if (!Database.Exists("LocabalSqlContext"))
        {
            using (var db = new LocabalSqlContext())
            {
                db.Database.Initialize(true);
            }
        }
    }

    [TestInitialize]
    public virtual void StartDbTransaction()
    {
        Transaction = new TransactionScope();
    }

    [TestCleanup]
    public virtual void EndDbTransaction()
    {
        Transaction.Dispose();
    }
}
于 2013-02-28T21:23:21.240 に答える