我们有多个开发人员在使用Entity Framework 5.0的项目上工作。 每个开发人员都使用他自己的本地SQL 2012数据库,以便在不妨碍其他人的情况下开发和testing。 起初,我们使用了自动迁移和基于代码的迁移的混合。 这根本不能很好地工作,所以我们决定禁用自动迁移,只允许基于代码。 我应该补充一点,我们再次启动一个干净的数据库,没有从所有的自动迁移中“损坏” _MigrationsHistory 。 所以现在的工作stream程是: 开发人员更改他的数据模型 add-migration <Name>并将其应用到他的数据库与update-database 。 检查数据模型更改和迁移到Git。 另一个开发人员将接收更改并将其应用于其数据库。 到目前为止,这工作得很好。 然而,在今天之前,通常只有我是使移民和其他人实行移民。 但是今天有三个开发者的迁移。 我只是把这些迁移,做了一个update-database ,这很好。 然而,我也对自己的datamodel进行了修改,所以在update-database的最后,它给了我一个警告,说明我还没有及时更新,所以我做了add-migration <my migration> 。 但是,当它支持迁移时,它给了我已经应用到数据库的所有迁移的变化。 所以:它试图删除已经被删除的列,尝试创build一个已经存在的表等。 怎么可能? 我的假设是,EF只会检查_MigrationsHistory表,并找出表中尚未出现哪些迁移,然后逐一应用名称中包含的时间戳。 但显然不是,因为即使当我撤消自己的变化,我有一个干净的环境,它仍然抱怨我的数据库不与模型同步。 但我只是把这些改变,并将其应用到我的数据库。 它是同步的。 我可以看到我刚刚在_MigrationsHistory表中应用的迁移。 我能想到的唯一的事情是我添加了一个属性到一个datamodel,不会导致数据库的变化(我添加了一个List<X> datamodel Y其中X是在一对多关系中的许多。这不会导致数据库更改,因为X已经有一个外键到Y)。 那可以吗? 如果是这样,这真的很脆弱,因为没有办法为此添加迁移,因为没有数据库更改,我不知道如何解决这个问题。 我不知道如何处理这个问题,因为我当然可以编辑它的脚手架,并删除已经应用到我的数据库的所有东西。 但是呢? 我检查了一下,然后其他一些开发者得到了同样的信息,即使在应用我的新变更之后,他的数据库也没有及时更新,脚手架自己的变化,得到同样的废话脚手架,编辑它,检查它,然后下一个开发人员得到它。 它变成了一个恶性循环,与我们使用自动迁移时所遇到的类似,我认为我们已经通过切换到仅基于代码的方式来解决这个问题。 现在我不能相信它做正确的事情,这是一个噩梦,这样的工作。 我也尝试过使用update-database -t:201211091112102_<migrationname>将我从同事那里获得的迁移一一添加,但无济于事。 它仍然给我错误的脚手架。 那么,我们在这里做错了什么,或者EF是不是为这样的协作而build? UPDATE 我创build了一个可重复的testing用例,但是为了模拟这个多用户/多数据库场景,这是一个漫长的舞蹈。 https://github.com/JulianR/EfMigrationsTest/ 有上述项目时重现的步骤(这些步骤也存在于代码中): 添加迁移Init 更新数据库(在数据库'TestDb') 将连接string更改为指向TestDb1 […]
根据这篇博客文章,大多数使用EF迁移的公司都没有用EF迁移来更新生产数据库的数据库模式。 相反,博客文章的作者build议使用架构更新脚本作为部署过程的一部分。 我已经使用了Schema更新脚本几年了,在他们工作的时候,我计划在未来使用EF迁移,原因如下: 更快的部署,更less的停机时间 更简单的部署过程 现有数据的迁移比使用T-SQL更容易 一个更易于理解的等待应用的变化语法(在传统环境中,使用干净的C#语法的DbMigration类与笨重的T-SQL迁移脚本)。 如果新软件版本的部署失败,那么旧的数据库模式有一个简单而快速的降级path 我能想到的一个原因是禁止使用EF来迁移生产数据库,如果数据库模式只是由DBA而不是开发人员所改变。 但是,我既是DBA又是开发人员,所以这对我来说并不重要。 那么,使用EF更新生产数据库有哪些风险呢? 编辑:我想补充说,正如solomon8718已经build议,我总是拉生产数据库的全新副本到我的登台服务器,并testingEF Migrations应用在登台服务器上,然后将其应用到生产服务器。 IMO对于生产系统的任何模式更新都是必不可less的,无论我是否使用EF迁移。
我有一个有趣的效果使用迁移(EF 5.0)和代码优先: 我创build了一些带有GUID主键的模型。 (顺便说一句:对我来说,SQL Server使用NEWSEQUENTIALID() ,这似乎是当前版本的默认值) 在某个时候,我激活了迁移。 我添加了一些代码到最初的迁移,这是大多数.Index()根据需要。 当我删除数据库并调用update-database时,出现以下错误: 无法更新数据库以匹配当前模型,因为有未决的更改,并且禁用了自动迁移。 将挂起的模型更改写入基于代码的迁移或启用自动迁移。 将DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为true以启用自动迁移。 您可以使用“添加迁移”命令将挂起的模型更改写入基于代码的迁移。 我尝试了AutomaticMigrationsEnabled = true ,它不改变或添加任何东西! 但是因为我不想要AutomaticMigrationsEnabled ,我也试着再次删除数据库,名为update-database ,然后add-migration 。 我结束了一个额外的迁移,似乎不会改变任何东西(见下文)。 我也尝试将这些行添加到最初的迁移的底部 – 但是这不会改变任何东西。 其中一个模型: [Table(Speaker.TABLENAME)] public class Speaker : BaseModel { public const String TABLENAME = "Speaker"; [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Guid Id { get; set; } [Required] [MaxLength(50, ErrorMessage = "Name must be […]
我试图忽略使用Entity Framework 6.0 rc1的“自动”迁移。 我的问题是,我现在不想要这个function,每当我的应用程序运行,我可以看到所有的实体日志试图创build所有的表。 期待谢谢。
如何使用entity framework5代码优先迁移来创build从初始(空)状态到最新迁移的完整数据库脚本? 在MSDN博客的博客文章build议这样做,但它似乎创build一个空的脚本: Update-Database -Script -SourceMigration: $InitialDatabase