0

Nuget Package Manager の MVCScaffolding を使用し、その仕組みに関する簡単なチュートリアルに従いました。それは十分に単純に思えます。実行 Scaffold Controller Team –Repository -Forceすると、「チーム」を取り巻くすべてのリポジトリ パターンが作成されます。

ただし、これを打破する試み (および成功) として、「チーム」クラス ( ) に追加のフィールドを追加することにしましたmyRandomField。予想通り、コンパイルすると、MVC ビューで次のようなエラーが発生しました。

データベースが作成されてから、「MvcApplication1Context」コンテキストをサポートするモデルが変更されました。データベースを手動で削除/更新するか、IDatabaseInitializer インスタンスで Database.SetInitializer を呼び出します。たとえば、DropCreateDatabaseIfModelChanges 戦略は、データベースを自動的に削除して再作成し、オプションで新しいデータをシードします。

明らかに、このエラーは、モデルを更新したため (Code-first??)、DB がモデルと「同期していない」ためです。

この問題を回避する最善の方法は何ですか? モデルと DB を同期させる簡単な方法はありますか?開始しているプロジェクトが徐々に展開されるため、モデルに多くの編集を行う予定です (そのため、毎回完全なデータベースの再構築を行うことは問題外です)。この場合、コードファーストは私にとって正しいアプローチですか? 私はこのプラグイン/ツールが本当に好きで、それを使わないのは残念です.

4

1 に答える 1

3

ジャド、

上記の私のコメントで述べたように、DB 内のすべての既存データを失うことに満足している場合は、global.asax に次を追加できます。

[Conditional("DEBUG")]
private static void InitializeDb()
{
    using (var db = new YourContext())
    {
        // double indemnity to ensure just sqlserver express
        if (db.Database.Connection.DataSource != null
            && db.Database.Connection.DataSource.IndexOf("sqlexpress", 
            StringComparison.InvariantCultureIgnoreCase) > -1)
        {
            // Initializer code here
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<YourContext>());
        }
    }
} 

そして、これを from から呼び出しますApplication_Start()

protected void Application_Start()
{
    InitializeDb();
    ViewEngines.Engines.Add(new MobileViewEngine());
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
}

データを保持したい場合は、データ移行ツールを使用する必要があります。これを実行するために Red Gate ツール ( SQL 比較バンドル) を使用しました。基本的に、これは新しいスキーマと古いスキーマを見て、元の db ファイルに触れることなく、既存のデータを新しいスキーマに移行し、テストと展開の準備を整えます。

これはあなたにとってうまくいくはずだと思います。

于 2012-07-20T14:48:53.833 に答える