数据层的Code First迁移问题

Code First Migration Problem in Data Layer

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

我现在正在将应用重组为表示层、数据层和服务层:

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

Unable to generate an explicit migration because the following explicit migrations are pending: [--list of all migrations--]. Apply the pending explicit migrations before attempting to generate a new explicit migration.

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

当我尝试 运行ning 更新数据库时,我收到一条错误消息:

There is already an object named 'Name of Existing Table' in the database.

我假设您使用 EF6,因为 EF Core 使用不同的 table 布局(并且不在数据库中包含名称空间,因此您可能不会遇到此问题第一名)。

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

因此最终您有两个选择 - 或定义自定义 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
{
   ...
}