開発ボックスのSQLServer 2008 R2 DeveloperEditionで実行されているApplicationName_Developmentというデータベースがあります。
.NETメンバーシップテーブルをデータベースに問題なく追加しました。 Code Firstを機能させようとすると、次のエラーメッセージが表示されました。
サーバーでリクエストの処理中にエラーが発生しました。例外メッセージは、「データベースにモデルメタデータが含まれていないため、モデルの互換性を確認できません。IncludeMetadataConventionがDbModelBuilder規則に追加されていることを確認してください。
少しグーグルした後、データベースを削除してEFにデータベースを作成させる必要があることに気付きました。それは問題ありませんが、.NETメンバーシップテーブルをすべて失いました。戻ってメンバーシップテーブルを再度追加できますが、モデルが変更され、EFがデータベースを再作成する必要がある場合は、メンバーシップテーブルを再度追加する必要があります。
どうすればこれを回避できますか?
ここで簡単な回避策を見つけました。これがお役に立てば幸いです。
http://www.paragm.com/ef-v4-1-code-first-and-asp-net-membership-service/
これがコードファーストの仕組みです。最初のコードの主な考え方は、データベースを作成するのはモデルの責任であるため、データベースに触れないことです。データベースをカスタマイズする場合は、カスタムIDatabaseInitializer
を作成し、カスタムSQLを追加する必要があります。
public class MyDbInitializer : DropCreateDatabaseIfModelChanges<MyContext>
{
protected override void Seed(MyContext context)
{
// Here run your custom SQL commands
context.Database.ExecuteSqlCommand("CREATE TABLE ....");
}
}
これで、アプリケーションの起動時にcutomイニシャライザーをセットアップするだけで済みます。
Database.SetInitializer<MyContext>(new MyDbInitializer());
この方法で実行したくない場合は、データベースを手動で保守し、初期化子をnullに設定する必要があります。
別のオプションは、System.Web.Management名前空間を使用することです。私は以下のコードで大成功を収めました:
string connectionString = ConfigurationManager.ConnectionStrings["MyDatabaseContext"].ConnectionString;
string database = "MyDatabaseName";
SqlServices.Install(database, SqlFeatures.All, connectionString);
データベースを作成するだけで、その後、標準のメンバーシップAPIを使用してユーザーを追加できます。
別の可能性があります。
MvcMusicStore
サンプルを見ると-再構築時にデータベースをシードする役割を担うSampleData
クラスがあります。 SampleData
クラスはDropCreateDatabaseIfModelChanges
を継承し、Seed
メソッドをオーバーライドします。このクラスは、Database.SetInitializer
のApplication_Start
メソッドのglobal.asax
に渡されます。
SampleData
の親クラスをCreateDatabaseIfNotExist
に変更するまで、同じエラーが発生していました。
次に、Seed
メソッドをオーバーライドして、データベースを吹き飛ばすことなく、起動時に必要なデータを挿入できます。
開発中に、2つのデータベースと2つの接続文字列を作成します。 1つはSqlMembership(aspnet_regsqlを使用)用で、もう1つはEFアプリケーション用です。それらを本番環境で単一のDBにマージする場合は、web.config.releaseの接続文字列を同じに変更するだけです。次に、EFモデルの変更により、メンバーシップDBではなくアプリデータベースが削除されます。
認証コンポーネントを個別に扱うことにより、認証システムをアプリケーションシステムから自然に切り離すことができます。次に、メンバーシッププロバイダーを変更する場合は、セットアップが適切になります。
システムが成長するにつれて、最初にEFコードのない非純粋なモデルをサポートする必要がある可能性が高いため、これはその道を進むための優れたテンプレートです。
私は何も遊んでいない最も簡単な方法は次のとおりでした。
DropAndRecreatedatabase
を常にInitilizer
に入れて、アプリケーションを初めて実行しました。
これは私のデータベースを初めて作成しました。
これに続いて、これをDropCreateDatabaseIfModelChanges
に変更しました。