EF添加迁移异常:无法加载程序集

时间:2012-06-01 21:17:33

标签: c# ef-migrations

我只有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
        }
    }
}

0 个答案:

没有答案