1

Entity Framework 5、.NET 4.5、およびVisualStudio2012を備えたASP.NETMVC4プロジェクトがあります。私のソリューションでは、すべてのモデルをModelというプロジェクトに入れ、すべてのリポジトリとDbContextをDataというもう1つのプロジェクトに入れました。 。Enable-Migrationsコマンドを使用して、データプロジェクトの移行をアクティブ化します。手動で処理することにしました。Add-Migrationコマンドを使用して新しい移行を作成すると、すべてが非常にうまく機能します。たとえば、テーブルに新しい列を追加すると、正常に機能します。データベーススキーマに新しい列が表示され、_MigrationHistoryテーブルに新しいレコードが表示されます。この時点で、新しい列が作成されたので、この列を適切なモデルに追加する必要があります。そこで、このメソッドをコードファーストモデルクラスに追加して、プロジェクトを実行します。データベースを削除し、最初の移行で初期化します。私は出来ます' すべてのデータを失うことなくモデルを微調整します。この動作を回避するにはどうすればよいですか?ありがとう

アップデート:

Configuration.cs

namespace NegoziazioneEventi.Data.Migrations
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;

    internal sealed class Configuration : DbMigrationsConfiguration<NegoziazioneEventi.Data.NeDataContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
        }

        protected override void Seed(NegoziazioneEventi.Data.NeDataContext context)
        {

        }
    }
}

Global.asaxのApplication_Start()

protected void Application_Start()
        {

            // init basic data on database
            System.Data.Entity.Database.SetInitializer(new Models.InitData());

            AreaRegistration.RegisterAllAreas();

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

            _container = Bootstrapper.GetWindsorContainer();

        }
4

1 に答える 1

2

私はそれらを手動で処理することにしました。Add-Migration コマンドで新しい移行を作成すると、すべてがうまく機能します。... この時点で、新しい列が作成されたので、この列を適切なモデルに追加する必要があります。そこで、このメソッドをコード ファースト モデル クラスに追加して、プロジェクトを実行します。

これは移行の完全に間違った使い方であり、EF がデータベースを削除する理由でもあります。最初にモデルにプロパティを追加してから移行を追加する必要があります。これは、EF が正しいデータを_MigrationHistoryテーブルに格納して、そのレコードとその移行の実際の意味を一致させる必要があるためです。

現在のアプローチでは、EF はアプリケーションを実行して_MigrationHistoryテーブルをチェックしますが、テーブル内のレコードには新しく追加されたプロパティに関する情報が含まれていないため、EF はモデルに新しい変更が加えられたと考え、デフォルトの戦略を使用してデータベースを削除し、新しいものを作成します現在のモデルを反映しています。この動作を無効にすることもできますが、移行を正しく使用することから始めてください。

動作をオフにするには、次を使用します。

Database.SetInitializer<YourDatabaseContext>(null);

独自のイニシャライザを使用していますが、これはおそらく間違ったビルトイン イニシャライザから派生したものであり、現在のデータベースが削除されています。

于 2012-09-26T10:02:31.340 に答える