私は 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
}
}
}