2011-11-23 20 views
6

私はEntity Frameworkのコードファーストを使用して、小さなMVC 3のアプリを持っているモデルのため、この接続文字列を使用します。Entity Frameworkのコードファーストと接続文字列

data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|Journal.mdf;User Instance=true;Database=MyJournal 

を私はモデルを変更すると(例えば追加プロパティー)、私は期待通りになる

データベースが作成されて以来、 'JournalContext'コンテキストをサポートするモデルが変更されました。

開発モードであるので、Journal.mdfとJournal.ldfを削除します。私は再びアプリケーションを実行すると

は今、私がログインで要求

することはできません開いているデータベース「MyJournal」を取得します。ログイン が失敗しました。

私は

data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|Journal.mdf;User Instance=true;Database=MyJournal2 

に私の接続文字列を変更した場合

Journal.mdfが作成され、アプリが再び動作される( '2' を付加することによりDatabase=パラメータを変更)。私がいくつかの変更を行い、データベース名を再利用しようとすると、「Can not open」というエラーが出ます。

モデルを変更するたびに一意のデータベース名を指定する必要があるのはなぜですか。以前の名前を「削除」するにはどうすればよいですか?

+0

データベースを削除した後でアプリケーションを再起動していますか? – StriplingWarrior

+0

@StriplingWarrior:はい、ありがとうございます。私は再びアプリケーションを起動するとエラーが発生します。 –

答えて

6

毎回一意のデータベース名は必要ありません。モデルが最初に作成されると、DatabaseInitializerが実行されてデータベースが作成されていない場合は作成され、シードデータが追加されます。デフォルトのDatabaseInitializerは、モデルを使用するために必要なデータベーススキーマと、データベースで作成されたEdmMetadataテーブルに格納されているスキーマのハッシュ(Code Firstがデータベースを作成している場合)を比較しようとします。ハッシュ比較が異なる場合、そのエラーがスローされます。

明らかに、接続文字列を変更すると、「MyJournal2」という全く新しいデータベースが作成されます。

これを回避するには、EdmMetadataテーブルを削除して、再度イニシャライザを実行します。これを行うには、Visual Studioのデータベースエクスプローラーウィンドウでデータベースに接続し、次にEdmMetadataテーブルを検索するテーブルに移動し、右クリックして[削除]を選択します。

はまたGlobal.asax.csであなたのApplication_Start方法で

DbDatabase.SetInitializer(new DropCreateDatabaseIfModelChanges<dbType>()); 

を置きます。これにより、データベースが削除され、スキーマが変更されるたびに再作成されます。

詳しくはthis video on pluralsightを参照してください。特に、 'が変更された場合は、'というセクションがあります。

また、このリンクをDropCreateDatabaseIfModelChangesにチェックしてください。派生クラスを作成する必要がある場合は、実際に何が起こっているのか、データベースをシードする方法について説明します。

+0

.mdfファイルを削除すると、「アクセスが拒否されました」というエラーが表示されるのはなぜですか?削除された.mdfファイルにない場合、EdmMetadataテーブルはどこにありますか? –

+0

私はEdmMetadataテーブルを削除する方法について私の答えを更新しました。私はリンク先のビデオを見ることを強くお勧めします。かなりの理由で、Webサーバーがまだ実行されていて、そのデータベースにアクセスしているという理由で、「許可が拒否されました」というエラーが表示される可能性があります。 – link664

+0

そして、私は、あなたが.mdfファイルを削除した場合、EdmMetadataテーブルを含め、データベース自体が削除されているはずだと仮定しました。どのようにデータベースを削除していますか? SQL Expressマネージャーを通して? – link664

関連する問題