0

エンタープライズにおけるエンティティ フレームワークに関する Julie Lermans コースで、彼女は次のような基本コンテキスト クラスを作成します。

Public class BaseContext<Tcontext> : DBContext where Tcontext :DBContext
{
static BaseContext()
{
    Database.SetInitializer<TContext>(null);
}
Protected BaseContext()
:base("connectionStringName")
{}
}

これは次のように使用されます:

public class xxxContext : BaseContext<xxxContext>
{
public Field A { get;set;}
}

彼女は続けて、彼女のリポジトリでのデータベースの初期化は次のようになると言いました。

Database.SetInitializer(new MigrateDatabaseToLatestVersion<XXXXContext>())
using (var context = new xxxContext())
(
    Assert.AreEqual(0, context.Customers.Count()));
)

私の質問は: コードの最後のセクション (この例) では、Database.SetInitializer が最初に実行され、MigrateDatabaseToLatestVersion を初期化子として設定します。ただし、コンテキストの作成では、基本クラスの静的コンストラクターは、コンテキストが実際に作成される前に (Database.SetInitializer(null)) を実行します。コードが context.Customers.Count() に到達するまでに、初期化子は NULL になり、デフォルトの初期化子が実行されます (CreateIfDatabaseNotExists)。

私が間違っている?MigrateDatabaseToLatestVersion はどのように保持されますか? それともそうですか?

4

2 に答える 2

0

あなたの質問に答えるために、 を呼び出すDatabase.SetInitializer<TContext>(<ANY_DatabaseInitializer>);と、コンテキストの初期化戦略が登録または更新されます。

Database.SetInitializer(new MigrateDatabaseToLatestVersion<TContext>())', the TContext will set the Strategy toはい、静的コンストラクターでNullDatabaseInitializer` を設定した後に TContext にアクセスしている場合。これにより、最新の移行コードが実行されずに残り、不一致の例外が発生します。

Moover、このリンクを見てくださいEntity Framework Code First Web.config Initialization

トランスフォーマー そうです、web.config Entity Framework の初期化を使用する場合は、間違いなく Web.config 変換を使用する必要があります。彼らはとてもうまく一緒に行きます。ローカルの開発環境に特定の初期化戦略 (DropCreateDatabaseWhenModelChanges) があるとします。これにより、データベースが変更されるたびにデータベースを吹き飛ばすことができ、その後、最小限のデータで再シードされます。それが私がすることです。そして明らかに、本番環境でも同じことが必要です。冗談だけ。冗談だった。MigrateDatabaseToLatestVersion が必要な場合や、初期化を完全にオフにしたい場合があります。では、web.config の変更をどのように管理しますか。手動?

于 2013-11-01T21:27:59.270 に答える