我以某种方式让我的EF5项目进入了一个无法继续的状态。
当我执行'update-database'时,我得到:
好的,很好,所以我尝试'添加 - 迁移',我得到:无法更新数据库以匹配当前模型,因为存在挂起的更改并且已禁用自动迁移。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为true以启用自动迁移。 您可以使用Add-Migration命令将挂起的模型更改写入基于代码的迁移。
由于以下显式迁移未决,因此无法生成显式迁移:[]。在尝试生成新的显式迁移之前应用挂起的显式迁移。
20 GOTO 10 ??
此时我该怎么做? (除了切换到NHibernate?)
答案 0 :(得分:6)
对我有用的是:
add-migration DummyMigration
。这引起了我评论的一些虚假变化update-database
将迁移+元数据添加到[__MigrationHistory]
表。add-migration
/ update-database
。不太理想,看看是否有更好的解决方案会很酷,但这对我有用。
答案 1 :(得分:1)
对我来说,问题是我们已经重命名了迁移2014123456_Initial.cs的命名空间。
但VS没有在其关联的2014123456_Initial.Designer.cs中重新生成名称空间。
一旦Designer.cs被更改为使用相同的命名空间,它就会重新开始工作。
(也将此作为回答here发布,因为两个问题都非常相似)
答案 2 :(得分:1)
我将Configuration.cs
课程中的以下值从false
更改为true
。
AutomaticMigrationsEnabled = true;
在 App_Data 文件夹中,我重命名了我的项目数据库 - .mdf 结尾的文件(因此将创建一个新文件),并在包管理器控制台中我输入了以下命令:
<强>更新的数据库强>
之后,待处理的迁移顺利进行。
请注意,这对我有用,但如果这是最佳做法,我不是100%。无论如何,这个Entity Framework Code First迁移指南都说:
“如果您收到一个错误,表明某个表已经存在且无法创建,可能是因为您在删除数据库之后和执行update-database之前运行了该应用程序。在这种情况下,再次删除Movies.mdf文件并重试update-database命令。如果仍然出现错误,请删除迁移文件夹。“
同样关于AutomaticMigrationsEnabled = true;
此MSDN article, Data Points : A Code First Migrations Mystery: Solved告诉“迁移可以自动运行,这意味着将发现模型更改,并且将在数据库上创建和执行与更改相对应的迁移。所有这些在数据库初始化期间运行时发生。自动迁移对于简单的应用程序很方便,但你几乎无法控制它们。我通常不建议启用它们。当Code First将默认值切换为false时,我很高兴。“
答案 3 :(得分:0)
我在创建数据库中犯了错误
using System.ComponentModel.DataAnnotations;
using System.Globalization;
namespace ProductsManager.Models
{
public class Product
{
public int ProductId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string Production { get; set; }
public string Size { get; set; }
public decimal<--- Price { get; set; }
public string Barcode { get; set; }
}
}
添加迁移后初始化我实现并将代码更改为public int Price {get;组; } 做了相同的添加迁移DummyMigration并在迁移文件夹中创建了它 080372472_dummyMigration
namespace IdetityBeta.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class DummyMigration : DbMigration
{
public override void Up()
{
AlterColumn("dbo.Products", "Price", c => c.String());
}
public override void Down()
{
AlterColumn("dbo.Products", "Price", c => c.Decimal(nullable: false, precision: 18, scale: 2));
}
}
}
然后更新数据库和问题解决了
答案 4 :(得分:0)
我通过
解决了这个问题然后我可以在脚本中运行并添加新的迁移。这是在EF6和Nuget 2.8上 - 当问题发布时它可能没有用。
答案 5 :(得分:0)
Update-Database –TargetMigration <second_last_migration>
Add-Migration <full_name_including_timestamp_of_last_migration>
您需要包括时间戳记,以便迁移知道您要编辑现有迁移,而不是搭建新迁移。这将更新上一次迁移的元数据以匹配当前模型。
Update-Database
答案 6 :(得分:0)
当您尝试与具有与迁移基础相同的迁移的合并时,可能会发生这种情况,因为即使该表存在,迁移模式之一也存在模型差异
要解决此问题,您可以做的是通过命令创建合并迁移
添加迁移-IgnoreChanges
后跟迁移名称
这将使用当前模型作为快照创建一个空迁移。因此,这将解决您的模型差异问题,并且您的表和模型将保持同步