实体框架4.3.1添加迁移错误:“支持上下文的模型已更改”

时间:2012-07-03 21:13:51

标签: entity-framework-4.3 ef-migrations

尝试运行EF 4.3.1 add-migrations命令时出错:

“自创建数据库以来,支持...上下文的模型已发生变化”。

这是一个得到错误的序列(尽管我已经尝试了十几种变体,但都失败了)......

1)从EF Code First创建的数据库开始(即,已经包含只有InitialCreate行的_MigrationHistory表)。

2)此时应用程序的代码数据模型和数据库是同步的(数据库是在应用程序启动时由CF创建的)。

3)因为我的“服务”项目中有四个DBContexts,所以我没有运行'enable-migrations'命令(它不处理多重上下文)。相反,我手动创建了Services项目中的Migrations文件夹和Configuration.cs文件(包含在本文末尾)。 [我想我在某个地方读过这篇文章]

4)在数据库尚未更改且应用程序停止的情况下,我使用VS EDM编辑器对我的数据模型进行了微不足道的更改(将一个属性添加到现有实体),并让它生成新类(但显然没有修改数据库)。然后我重建解决方案,所有看起来都很好(但当然不要删除数据库或重新启动应用程序)。

5)我运行以下PMC命令(其中“App”是Configuration.cs中其中一个类的名称):

PM> add-migration App_AddTrivial -conf App -project Services -startup Services -verbose

...因“模型......已更改而失败。请考虑使用Code First Migrations ...”错误。

我做错了什么?还有其他人看到工具中的讽刺告诉我使用我已经尝试使用的东西; - )

从EF CF创建的数据库开始设置解决方案的正确步骤是什么?我已经看过帖子说要用-ignorechanges进行初始迁移,但我已经尝试过了,但没有用。实际上,我花了所有DAY测试各种排列,没有任何作用!

我必须做一些非常愚蠢的事情,但我不知道是什么!

谢谢,

DadCat

Configuration.cs:

命名空间mynamespace {     内部密封类App:DbMigrationsConfiguration     {         公共应用()         {             AutomaticMigrationsEnabled = false;             MigrationsNamespace =“Services.App.Repository.Migrations”;         }

    protected override void Seed(.Services.App.Repository.ModelContainer context)
    {

    }
}

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

    protected override void Seed(Services.Catalog.Repository.ModelContainer context)
    {

    }
}

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

    protected override void Seed(Services.PortfolioManagement.Repository.ModelContainer context)
    {

    }
}

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

    protected override void Seed(Services.Scheduler.Repository.ModelContainer context)
    {

    }
}

}

1 个答案:

答案 0 :(得分:0)

使用EF迁移时,每个数据库应该有一个数据上下文。我知道它可以变得非常大,但是通过尝试拆分它会遇到几个问题。一个是您遇到的迁移问题。稍后,当您尝试从不同的上下文中连接表时,您可能会遇到问题。不要这样做,这与EF的设计方式有关。