7

私は EF 移行の経験が 2 日しかないので、よろしくお願いします...

かなり大規模な既存の WPF WCF MVVM EF 4.1 ソリューションを EF 4.3.1 に移行し、移行の使用を開始する必要があります。ソリューションの "Services" プロジェクトには 4 つの DbContext が含まれており、それぞれが独自の名前空間にあり、それぞれが独自のデータベースに関連付けられています。

大規模なソリューションの変更を開始する前に、1 つのプロジェクトと 2 つの DbContext のみを含む小さなサンプル コンソール アプリを使用していくつかの実験を行いました。これは主に "e10" ( 1 つのデータベースに複数の DbContext がある EF 4.3 自動移行)によって提供された例に基づいています。 . サンプル アプリは問題なく動作し、(-configuration パラメーターを指定して) 2 つのコンテキストに対して add-migration と update-database を個別に実行できます。

しかし、「実際の」(大規模な) ソリューション (4 つの DbContext を使用) で同じアプローチを複製しようとすると、問題が発生しました。PMC で add-migration を呼び出し、4 つの構成名のいずれかを指定すると、add-migrations が取得されますServices アセンブリを読み込めないという例外。

大規模なソリューションで行ったことは次のとおりです。

1) EF 4.3.1 NuGet パッケージをコア、サービス、および UI プロジェクトに追加しました (この最後のビットは重要かもしれません)。

2) Services プロジェクトに Migrations フォルダーを作成し、DbMigrationsConfiguration< type >から継承する 4 つのクラスを含む Configuration.cs ファイルを手動で作成しました。ここで、type は App、Catalog、PortfolioManagement、または Scheduler です。(コードは以下)

3) App DbContext に関連付けられたモデル クラスの 1 つにプロパティを追加したため、移行するものがあります。

4) PMC から、add-migration を呼び出します。

 PM> add-migration App_AddNewProperty -config App

e10 が彼の投稿で述べたように、「Enable-Migrations」を実行しなかったことに注意してください。

「上記の...クラスを既に使用しているため、移行を有効にする必要はありません」(Configurations.csのクラスを参照)。

5) add-migration gets exception: ファイルまたはアセンブリ 'MyApp.Services' またはその依存関係の 1 つを読み込めませんでした

バインド失敗ログを有効にしましたが、失敗ログには、Services プロジェクトではなく、 UI のbin/debug フォルダーでServices アセンブリを見つけようとしていることが示されています)。

また、PMC のデフォルト プロジェクトをサービス プロジェクトに設定しても、同じように失敗します (デフォルト プロジェクトのデフォルトは UI プロジェクトです)。

これは、UI に Services アセンブリへの参照がないことが原因であると思われます (WCFサービス参照はありますが、アセンブリ参照はありません)。しかし、これが問題である場合、UI プロジェクトで PMC を強制的に開始しないようにするにはどうすればよいですか? または、「EF パッケージから UI プロジェクトの関連付けを解除」できますか?

ありがとう!

お父さん猫

Configurations.cs:

namespace MyApp.Services.Migrations
{
    internal sealed class App : DbMigrationsConfiguration<Geophysical.Skimmer.Services.App.Repository.ModelContainer>
    {
        public App()
        {
            AutomaticMigrationsEnabled = false;
            MigrationsNamespace = "MyApp.Services.App.Repository.ModelContainer";
        }

        protected override void Seed(MyApp.Services.App.Repository.ModelContainer context)
        {
            ... no code here
        }
    }

    internal sealed class Catalog : DbMigrationsConfiguration<Geophysical.Skimmer.Services.Catalog.Repository.ModelContainer>
    {
        public Catalog()
        {
            AutomaticMigrationsEnabled = false;
            MigrationsNamespace = "MyApp.Catalog.Repository.ModelContainer";
        }

        protected override void Seed(MyApp.Services.Catalog.Repository.ModelContainer context)
        {
            ... no code here

        }
    }

    internal sealed class PortfolioManagement : DbMigrationsConfiguration<Geophysical.Skimmer.Services.PortfolioManagement.Repository.ModelContainer>
    {
        public PortfolioManagement()
        {
            AutomaticMigrationsEnabled = false;
            MigrationsNamespace = "MyApp.PortfolioManagement.Repository.ModelContainer";
        }

        protected override void Seed(MyApp.Services.PortfolioManagement.Repository.ModelContainer context)
        {
            ... no code here
        }
    }

    internal sealed class Scheduler : DbMigrationsConfiguration<Geophysical.Skimmer.Services.Scheduler.Repository.ModelContainer>
    {
        public Scheduler()
        {
            AutomaticMigrationsEnabled = false;
            MigrationsNamespace = "MyApp.Services.Scheduler.Repository.ModelContainer";
        }

        protected override void Seed(MyApp.Services.Scheduler.Repository.ModelContainer context)
        {
            ... no code here
        }
    }
}
4

0 に答える 0