【问题标题】:Code First Migration Problem in Data Layer数据层中的代码优先迁移问题
【发布时间】:2020-06-15 20:38:57
【问题描述】:

我有一个现有的 ASP.NET MVC 4 Web 应用程序,其中所有代码文件都驻留在一个项目中:

  • Satinge(.NET Framework MVC 4 Web 应用程序项目)

我现在将应用程序重新组织为表示层、数据层和服务层:

  • Satinge(.NET Framework MVC 4 Web 应用程序 - 表示层项目)
  • Satinge.Data(.NET Framework 类库 - 数据层项目)
  • Satinge.Services(.NET Framework 类库 - 服务层项目)

我已将所有数据模型和迁移文件移至数据层,到目前为止,当我尝试在调试模式下运行它时,该应用程序构建良好并且可以正常工作。但是,当我尝试添加新模型时,它不会让我在 Package Manager Console 中运行 Add-Migration 命令(默认项目:Satinge.Data)。我收到以下错误:

无法生成显式迁移,因为以下显式迁移处于挂起状态:[--list of all migrations--]。在尝试生成新的显式迁移之前应用挂起的显式迁移。

它要我应用已经应用到数据库的迁移。

当我尝试运行 Update-Database 时,我收到一条错误消息:

数据库中已经有一个名为“现有表的名称”的对象。

【问题讨论】:

  • 你有没有在运行这样的命令时声明启动项目startup-project -StartupProject ProjectName
  • @viveknuna 我正在使用 VS 2017 IDE,在包管理器控制台中我选择 Satinge.Data 作为默认项目,然后我尝试运行命令 PM> Add-Migration AddSample 和 PM> Update-Database
  • 您在移动模型命名空间时是否更改了它们?
  • @timur 是的,我在移动模型和迁移文件后更改了命名空间。 Satinge.Models 到 Satinge.Data.Models 和 Satinge.Migrations 到 Satinge.Data.Migrations。
  • this answer 可能相关吗?

标签: asp.net-mvc-4 visual-studio-2017 ef-code-first entity-framework-migrations


【解决方案1】:

我假设您使用 EF6,因为 EF Core 使用不同的表布局(并且不包括数据库中的命名空间,因此您可能一开始就不会遇到这个问题)。

由于 EF 需要跟踪您的实际数据库状态以进行迁移,它使用一个名为 __MigrationHistory 的特殊表(如果需要,它是 can be renamed)。由于您的迁移是很好的 C# 类 - 然后引擎需要以某种方式确定其中哪些已经应用。 EF 开发人员选择选择完全限定的类名。这正是该表上的ContextKey 列的用途。

所以最终你有两个选择 - update the table 或定义自定义 DbConfiguration 以使用不同的命名空间:

public class MyDbConfiguration: DbConfiguration
{
    public MyDbConfiguration()
    {
        AutomaticMigrationsEnabled = false;
        ContextKey = "Old.Migrations.Namespace";
    }
}
...
[DbConfigurationType("MyNamespace.MyDbConfiguration, MyAssembly")] // there are few ways to plug it in: https://docs.microsoft.com/en-us/ef/ef6/fundamentals/configuring/code-based
public class MyContextContext : DbContext
{
   ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    相关资源
    最近更新 更多