我在使用EF5的4名开发人员的团队中工作,每个人都在自己的本地数据库上工作。到目前为止,我们一直在使用自动迁移,但我们已接近需要发布到生产的位置,因此我们已禁用自动迁移并开始添加基于代码的显式迁移。
问题出现了:在开发人员创建新的显式迁移后我运行了Update-Database
命令,我收到以下错误:
Applying code-based migrations: [201209080142319_CreatedDate.LastModifiedDate.Additions].
Applying code-based migration: 201209080142319_CreatedDate.LastModifiedDate.Additions.
Applying automatic migration: 201209080142319_CreatedDate.LastModifiedDate.Additions_AutomaticMigration.
Automatic migration was not applied because it would result in data loss.
即使我禁用了自动迁移,为什么会出现此错误?我可以通过删除显式迁移然后重新构建它来运行Add-Migration
来修复此错误。然后Update-Database
运行正常并且没有提到任何关于'自动迁移...'的信息。此外,我运行Add-Migration时创建的迁移中的代码与我的队友创建的代码相同。我不明白为什么它会尝试自AutomaticMigrationsEnabled = false;
以来进行自动迁移。
我在这里缺少什么?
答案 0 :(得分:25)
我不想回答我自己的问题,但我又遇到了这个问题。我的团队中的开发人员在其本地计算机上重新启用了自动迁移,然后创建了一个显式迁移,一旦我运行它就会重现此行为。
实体框架始终运行自动迁移,然后运行显式迁移,其Source
文件中定义了.resx
属性,即使> strong> AutomaticMigrationsEnabled = false
。如果在运行自动迁移后创建了Source
属性,则显式迁移将仅设置{{1}}属性。
结果是,禁用自动迁移仅意味着EF在检测到模型更改时不会自动升级您的架构 - 但如果需要填补某些显式迁移之间的间隙,它仍可能会执行自动迁移。要避免此行为,请不要混合使用自动迁移和显式迁移。
答案 1 :(得分:3)
public class Configuration : DbMigrationsConfiguration<bailencasino.com.dal.Context.BlncnoContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
AutomaticMigrationDataLossAllowed = true;
}
添加AutomaticMigrationDataLossAllowed = true;
,因此您假设您希望允许EF添加导致数据丢失的删除SQL对象。
答案 2 :(得分:0)
AutomaticMigrationEnabled = false
会阻止您的应用程序自行更新数据库。
但是,由于您自己运行Update-database,Update-Database会检查数据库的当前状态,然后运行数据库中尚未包含的所有迁移步骤,包括没有代码的模型(dbContext)中的更改 - 基于迁移。
我的猜测是,模型会发生变化,导致数据丢失。
您可以使用-force
参数在数据丢失时应用更改。
答案 3 :(得分:0)
我的团队经历过可能与此相关的事情。如果两个团队成员都添加了迁移,检查他们的代码,获取最新信息,然后执行update-database,则第二个团队会收到错误,因为迁移“已跳过” - 他们的系统看到团队成员的迁移从未实现过
我们已经开始检查所有内容并获取最新信息,执行更新数据库(如果团队成员添加了新迁移),然后执行add-migration,update-database,check-in。
答案 4 :(得分:0)
@Dave Graves是正确的。我遇到了同样的问题,并做了修复,以禁用特定迁移文件的自动迁移
这里有一些说明:
202008181102535_BlogPost.cs
Source
属性是由Resources.GetString("Source")
之类的东西设置的。将其替换为null
,然后再次尝试在包管理器控制台中手动执行update-database
。