我只有2天的EF迁移经验,所以请善待......
我有一个相当大的现有WPF WCF MVVM EF 4.1解决方案,需要迁移到EF 4.3.1并开始使用迁移。解决方案的“服务”项目包含四个DbContext,每个都在自己的命名空间中,每个都与自己的数据库相关联。
在我开始修改大型解决方案之前,我做了一些小样本控制台应用程序的实验,只有一个项目和两个DbContexts,主要基于“e10”提供的示例 (EF 4.3 Auto-Migrations with multiple DbContexts in one database)。示例应用程序运行良好,我可以分别为两个上下文执行add-migration和update-database(通过指定-configuration参数)。
但是当我尝试用“真正的”(大)解决方案复制相同的方法 - 使用四个DbContexts时 - 我遇到了一个问题:当我在PMC中调用add-migration并指定四个配置名称中的任何一个时,添加-migrations得到一个例外,说它无法加载服务程序集。
以下是我对大型解决方案所做的工作:
1)在我的核心,服务和UI项目中添加了EF 4.3.1 NuGet包(最后一点可能很重要)。
2)在我的Services项目中创建了一个Migrations文件夹,并手动创建了一个Configuration.cs文件,其中包含四个继承自DbMigrationsConfiguration< type >的类,其中type是App,Catalog,PortfolioManagement或Scheduler 。 (代码如下)
3)将一个属性添加到与App DbContext关联的模型类之一,因此可以迁移
4)从PMC调用add-migration:
PM> add-migration App_AddNewProperty -config App
请注意,我没有执行“启用迁移”,因为正如e10在帖子中所说:
“你不需要启用迁移,因为你已经使用了上面的......类”(参考Configurations.cs中的类)。
5)add-migration异常:无法加载文件或程序集“MyApp.Services”或其依赖项之一
我启用了绑定失败日志记录,失败日志显示它正在尝试在 UI的 bin / debug文件夹中找到Services程序集,而不是在Services项目中。
即使我将PMC中的默认项目设置为服务项目(默认项目默认为UI项目),它也会失败。
我怀疑这是因为UI没有对服务程序集的引用(它有一个WCF 服务引用,但没有程序集引用)。但如果这是问题,我如何强制PMC不启动UI项目?或者我可以“将UI项目从EF包中取消关联”吗?
谢谢!
DadCat
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
}
}
}