web-dev-qa-db-ja.com

EF4.1コードファーストおよび既存のデータベースと.NETメンバーシップ

開発ボックスのSQLServer 2008 R2 DeveloperEditionで実行されているApplicationName_Developmentというデータベースがあります。

.NETメンバーシップテーブルをデータベースに問題なく追加しました。 Code Firstを機能させようとすると、次のエラーメッセージが表示されました。

サーバーでリクエストの処理中にエラーが発生しました。例外メッセージは、「データベースにモデルメタデータが含まれていないため、モデルの互換性を確認できません。IncludeMetadataConventionがDbModelBuilder規則に追加されていることを確認してください。

少しグーグルした後、データベースを削除してEFにデータベースを作成させる必要があることに気付きました。それは問題ありませんが、.NETメンバーシップテーブルをすべて失いました。戻ってメンバーシップテーブルを再度追加できますが、モデルが変更され、EFがデータベースを再作成する必要がある場合は、メンバーシップテーブルを再度追加する必要があります。

どうすればこれを回避できますか?

15
Mike

ここで簡単な回避策を見つけました。これがお役に立てば幸いです。

http://www.paragm.com/ef-v4-1-code-first-and-asp-net-membership-service/

5
cbrcoder

これがコードファーストの仕組みです。最初のコードの主な考え方は、データベースを作成するのはモデルの責任であるため、データベースに触れないことです。データベースをカスタマイズする場合は、カスタム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に設定する必要があります。

6
Ladislav Mrnka

別のオプションは、System.Web.Management名前空間を使用することです。私は以下のコードで大成功を収めました:

string connectionString = ConfigurationManager.ConnectionStrings["MyDatabaseContext"].ConnectionString;
string database = "MyDatabaseName";
SqlServices.Install(database, SqlFeatures.All, connectionString);

データベースを作成するだけで、その後、標準のメンバーシップAPIを使用してユーザーを追加できます。

5
wullinkm

別の可能性があります。

MvcMusicStoreサンプルを見ると-再構築時にデータベースをシードする役割を担うSampleDataクラスがあります。 SampleDataクラスはDropCreateDatabaseIfModelChangesを継承し、Seedメソッドをオーバーライドします。このクラスは、Database.SetInitializerApplication_Startメソッドのglobal.asaxに渡されます。

SampleDataの親クラスをCreateDatabaseIfNotExistに変更するまで、同じエラーが発生していました。

次に、Seedメソッドをオーバーライドして、データベースを吹き飛ばすことなく、起動時に必要なデータを挿入できます。

3
Phil

開発中に、2つのデータベースと2つの接続文字列を作成します。 1つはSqlMembership(aspnet_regsqlを使用)用で、もう1つはEFアプリケーション用です。それらを本番環境で単一のDBにマージする場合は、web.config.releaseの接続文字列を同じに変更するだけです。次に、EFモデルの変更により、メンバーシップDBではなくアプリデータベースが削除されます。

認証コンポーネントを個別に扱うことにより、認証システムをアプリケーションシステムから自然に切り離すことができます。次に、メンバーシッププロバイダーを変更する場合は、セットアップが適切になります。

システムが成長するにつれて、最初にEFコードのない非純粋なモデルをサポートする必要がある可能性が高いため、これはその道を進むための優れたテンプレートです。

2
Doug

私は何も遊んでいない最も簡単な方法は次のとおりでした。

DropAndRecreatedatabaseを常にInitilizerに入れて、アプリケーションを初めて実行しました。

これは私のデータベースを初めて作成しました。

これに続いて、これをDropCreateDatabaseIfModelChangesに変更しました。

0
Dee