数据层的Code First迁移问题
Code First Migration Problem in Data Layer
我有一个现有的 ASP.NET MVC 4 Web 应用程序,其中所有代码文件都位于一个项目中:
- Satinge(.NET Framework MVC 4 网络应用程序项目)
我现在正在将应用重组为表示层、数据层和服务层:
- Satinge(.NET Framework MVC 4 Web 应用程序 - 表示层项目)
- Satinge.Data(.NET Framework class 库 - 数据层项目)
- Satinge.Services(.NET Framework class 库 - 服务层项目)
我已将所有数据模型和迁移文件移动到数据层,到目前为止,当我在调试模式下尝试 运行 时,该应用程序构建良好并且可以运行。但是,当我尝试添加新模型时,它不会让我在 包管理器控制台 中执行 运行 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
{
...
}
我有一个现有的 ASP.NET MVC 4 Web 应用程序,其中所有代码文件都位于一个项目中:
- Satinge(.NET Framework MVC 4 网络应用程序项目)
我现在正在将应用重组为表示层、数据层和服务层:
- Satinge(.NET Framework MVC 4 Web 应用程序 - 表示层项目)
- Satinge.Data(.NET Framework class 库 - 数据层项目)
- Satinge.Services(.NET Framework class 库 - 服务层项目)
我已将所有数据模型和迁移文件移动到数据层,到目前为止,当我在调试模式下尝试 运行 时,该应用程序构建良好并且可以运行。但是,当我尝试添加新模型时,它不会让我在 包管理器控制台 中执行 运行 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
{
...
}