24

私は新しいASP.NET MVC 4アプリケーションを作成しました。ただし、データベースファイルがまだ存在しない場合は、データベースファイルを最初に作成するようには見えません。私はApp_Dataフォルダから.mdfファイルのファイルを削除した場合、アプリケーションがデータベースにアクセスしようとしたとき、私は次の例外を取得:コードが最初にデータベースを作成しようとしたときの例外

System.Data.SqlClient.SqlException: Cannot attach the file '<path-to-db-file>.mdf' as database '<my-db-file-name>'. 

私は、デバッガでのアプリでそれを実行した場合、私はそれを見ることができますLazyInitializer.EnsureInitializedを呼び出すときにInitializeSimpleMembershipAttribute :: OnActionExecutingメソッドで例外が発生しています。キャッチされた例外は次のとおりです。その後、私はそれの内部例外として、上記の最初の例外があります

[System.InvalidOperationException] {"The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588"} System.InvalidOperationException 

:の内部例外で

[System.Reflection.TargetInvocationException] {"Exception has been thrown by the target of an invocation."} System.Reflection.TargetInvocationException 

私が間違っていることは何ですか?

更新

私はちょうど新しいMVC4アプリでそれを試してみました。次のようにして複製することができます:

  1. VSウィザードでMVCアプリケーションを作成します。
  2. 初めてアプリケーションを実行し、ログインページに移動します(mdfファイルが生成されるようになります)。
  3. mdfファイルを削除し、ログインページに戻ります。例外がスローされます。
+7

あなたはこれを理解できましたか? – Eonasdan

+0

@Eonasdan、1年後、はい。私の答えを見てください。 – joelmdev

答えて

0

IISExpressインスタンスを停止し、Visual StudioでF5キーを押して再起動する必要があります。その後、データベースを再度作成することができます。

2

あなたは次のように、プロジェクトのルートフォルダにGlobal.asaxファイルのApplication_Startメソッド内のコードまずデータベースの初期化を処理することができます:あなたはSetInitializerする場合はnullを渡すと、それは作成されません

protected void Application_Start() 
    { 
     Database.SetInitializer<MyDBContext>(null); 
    } 

をかデータベーステーブルを変更するには、手動で行う必要があります。

データベースが再生成されないのは、Application_Startがアプリケーションの有効期間中に1回だけ起動されるためです。

+1

これはもはやMVC4のベストプラクティスではありません。代わりにApp_Startフォルダー内のクラスを使用します。 – kingdango

2

MVC生成コードは、 "DefaultConnection"というデータベース接続文字列で動作します。中 あなたがWeb.configファイルに別の名前を使用する場合は、この名前を参照する必要があります。

  1. InitializeSimpleMembershipAttribute.csでInitializeSimpleMembershipAttribute.SimpleMembershipInitializer.ctor())。
  2. UsersContext.ctor()AccountModel.cs

(またはちょうどあなたのプロジェクトに "DefaultConnectionを" で検索)。

1

エクスプローラで自動作成された.mdfファイルは、SQL管理ツールまたはオブジェクトエクスプローラでのみ削除しないでください。

問題は、あなたが提供している手順で複製できますが、データベースがまだLocalDbに登録されているということです。

+0

LocalDBはDatabase as Fileをサポートしているため、必ずしもそうである必要はありません。 http://blogs.msdn.com/b/sqlexpress/archive/2011/07/12/introducing-localdb-a-better-sql-express.aspx – joelmdev

4

、あなたのアプリケーションのInitializeSimpleMembershipAttributeクラスに掘る場合、あなたはそれを継承するActionFilterAttributeクラスの次のオーバーライドされたメソッドわかります

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     // Ensure ASP.NET Simple Membership is initialized only once per app start 
     LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock); 
    } 

ていることに注意してくださいコメントを。シンプルメンバーシップが適切に初期化されていることを確認するため、アプリケーションは実行ごとに1回チェックします。クラスの先頭にあるプライベート変数を見てください:

private static SimpleMembershipInitializer _initializer; 
    private static object _initializerLock = new object(); 
    private static bool _isInitialized; 

これらはすべて静的であり、すべてが参照として渡されます。ここで重要なのは_isInitializedです。 LazyInitializer.EnsureInitializedは、_isInitializedフラグをチェックし、falseの場合、渡されたrefターゲットを初期化します。この場合はSimpleMembershipInitializer_initializerです。その時点で、フラグをtrueに設定して動きます。 LazyInitializer.EnsureInitializedがフラグが真であると判断した場合、それは何もしませんが、ターゲットを返します。このフラグは静的変数であるため、アプリケーションの存続期間中はその値が維持されます。つまり、データベース初期化後、EnsureInitializedは、データベースファイルがなくなっても常にターゲットを戻します。つまり、初期化後に.mdfファイルを削除すると、アプリケーションは認識しません。アプリケーションがデータベースの読み書きを試みると、例外がスローされます。これを解決するには、アプリケーションを再起動する必要があります。これは、使用している場合、またはIISでアプリケーションを再起動している場合に、devサーバーを強制終了させることを意味します。

これはあなたが直面している問題ですが、この質問を実行している人の多くは、ログインしようとするとこのようなエラーメッセージが表示される、同様の問題を抱えていると思われます。

物理ファイル 'C:\ path \ to \ your \ project \ App_Data \ dbfile.mdf'を開いたり作成しようとすると、CREATE FILEでオペレーティングシステムエラー5(アクセスが拒否されました)が発生しました。 CREATE DATABASEが失敗しました。リストされたファイル名の一部を作成できませんでした。関連するエラーを確認してください。

これは非常に解決しやすいので、私はここでもそれをすばやくカバーします。

デフォルトでは、Visual Studio 2012は、LocalDBというSQL Server Expressのpared downバージョンを使用します。 LocalDBはアプリケーションの子プロセスをスピンアップし、Visual Studioの開発サーバーでアプリケーションを実行している場合(たとえば、http:// localhost:[ポート]がブラウザに表示されます)、両方のアプリケーションを実行している場合およびLocalDBは、SYSTEMまたはNETWORKSERVICEではなく、ユーザーアカウントで使用します。この問題を解決するために必要なのは、プロジェクトのApp_Dataフォルダに対してユーザーに変更権限を割り当てることだけです。ログインをもう一度やり直すと、.mdfファイルが正常に作成されます。

あなたは好奇心旺盛であれば、あなたはLocalDB here.

+0

を参照してください.App_Dataフォルダのアクセス許可を変更すると、私の問題が解決しました。私はこれが他人を助けることを望む。 – BrianLegg

9

についての詳細を学ぶことができますが、同じ問題に手に入れたと私の解決策hereを見つけました。 あなたがしなければならないのは、VSの開発者のコ​​マンドプロンプトを開いてLocalDbを停止し、入力します(引用符なし)です:

「sqllocaldb.exe停止v11.0」

「sqllocaldb.exeはV11を削除します。0"

次回EFは、ファイルだけでなく、DBを再生成します。私はこのエラーを受け取ったとき、私のためにそれを固定

+0

あなたのリンクは私を助けました:) –

+2

LocalDBインスタンスは他の名前を持っているかもしれません。 'sqllocaldb info'を実行すると、既存のすべてのLocalDBインスタンスが一覧表示されます。 – Paul

0

私は私のVSプロジェクトのApp.configファイルに接続文字列を変更したことです。

私は、接続文字列でこれを追加しました:

<connectionStrings> 
<add name="Blog" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;Integrated Security=true;AttachDbFileName=C:\Users\kostadin\Database1.mdf" providerName="System.Data.SqlClient" /> 

希望、これは他の誰かが助け

012。
関連する問題