实体框架添加迁移删除我手动添加的Sql()块

时间:2017-01-24 22:29:24

标签: c# entity-framework

我正在尝试清理旧项目,因为它已移入MVC5,我需要在迁移之前更改大量值。例如,字符串Y需要变为1。

看起来像是

    public override void Up()
    {
        Sql(@"
            UPDATE [pgm].[dbo].[t_openposition] SET breakfast = 0 WHERE breakfast='N';);
        AlterColumn("dbo.t_openposition", "breakfast", c => c.Boolean(nullable: false));
    }

    public override void Down()
    {
        AlterColumn("dbo.t_openposition", "discount", c => c.String(maxLength: 255, unicode: false));
    }

接下来,当我运行update-database时,它会失败并警告我需要添加迁移,因为事情已经发生了变化。但是,如果我运行add-migration,它会删除Sql()

的块

1 个答案:

答案 0 :(得分:0)

关于Add-Migration的问题是,它为您自动生成该文件,即timestamp_name_migration.cs。因此,当您运行Add-Migration NameOfMigration并且之前已运行Add-Migration NameOfMigration时,将再次生成该文件,并且您编写的任何代码都将丢失。迁移的关键在于所有这些都是为你完成的,你不应该做任何SQL。这就解释了为什么你会失去那条线。

对于错误,在您的情况下,只要执行第一个SQL语句,模型就不再与数据库匹配,EF将不会继续并抛出该错误。这个想法是他们总是同步。

我发现您正在尝试编辑数据库(而不是丢失数据)并更改架构(看起来像stringbool的列。)

如果您无法修改数据库,我建议使用以下内容:

在SSMS中小心地执行所有这些语句,直到您满意为止,然后对数据库模型进行逆向工程(#3 https://msdn.microsoft.com/en-us/library/jj200620(v=vs.113).aspx)并删除旧的代码。这将为您提供一个新的代码第一个模型,它将与数据库保持同步,一切都会很好。

如果你可以核对数据库:

  1. 删除数据库中的所有表格,包括__MigrationHistory
  2. 使用Configuration方法删除排除 Seed课程的所有迁移。
  3. 对模型进行更改
  4. Add-Migration Initial
  5. Update-Database
  6. 然后一切都会好起来的。