使用Code First在EF中重命名列

3
我在我的类中重命名了一列。它看起来像这样。
public class clsClassForStackoverflow
{
   [Column(TypeName = "varchar"), StringLength(150)]
   public string Name { get; set; }

由于结构发生了变化,我不得不对其进行重命名。因此,我删除了该行并添加了新属性。之后,我创建了一个新的迁移文件来准备我的数据库更新,在文件中,他想要删除旧列并添加新列。好吧,我将删除更改为重命名,因为数据库中仍有数据。如果删除它,数据就会消失。

新的迁移文件:

public partial class _100126_2 : DbMigration
{
    public override void Up()
    {
        RenameColumn("dbo.tbClassForStackoverflow", "ClassForStackoverflow_Name",   "ClassForStackoverflow_NewName");
    }

    public override void Down()
    {
        RenameColumn("dbo.tbClassForStackoverflow", "ClassForStackoverflow_NewName", "ClassForStackoverflow_Name");
    }
}

在启动数据库更新后,我查看了我的类,发现属性没有改变。它仍然被命名为“Name”,而不是“NewName”。我怎样才能在不让EF认为我删除并添加了一列的情况下更改它呢?


1
你确定迁移已经更新了有效的数据库吗?也许你使用的是与update-database不同的连接字符串。 - pwas
@pwas 是的。连接字符串指向我们的开发数据库。表已经有了正确的列。只是这个类的属性似乎没有更新。 - Cataklysim
你是手动在数据库中进行了更改,而不是通过迁移来完成的吗?或者现在具体问题是什么?我已经无法跟上了... - Christoph Fink
@ChrFin 不,我改变了迁移文件。旧的想要删除“Name”列并创建“NewName”列。由于数据丢失,我更改了迁移文件,只是修改了该列。我启动了更新,表格重命名了,但类没有。如果我在类中重命名属性并创建新的迁移文件,它可能会再次尝试删除该列。 - Cataklysim
1个回答

11
您需要按照以下顺序进行更改:
  1. 将实体中的 Name 属性重命名为 NewName
  2. 向项目添加一个新迁移
  3. 更改迁移以执行重命名,而不是删除/创建,仅更改Up/Down方法的内容
  4. 编译并运行迁移
这是我已经多次成功完成的方法。重要的是在创建迁移时不要触碰与之相关联的模型快照。
P.S.:如果我记得正确,EF甚至可以检测到重命名,如果满足某些(对我来说未知的)约束条件,因为我认为在进行简单的属性/列重命名时甚至不必总是更改迁移。

1
@Cataklysim:我建议将所有更改(包括数据库和代码)撤销到“错误重命名”之前的状态,然后重新进行重命名。 - Christoph Fink
@ChrFin 这并不完全正确...我已经尝试过了,它重命名了旧的 EF Core 迁移文件,这正是我们不想要的!这样做很危险! - starmandeluxe
@starmandeluxe 这个问题是关于 EF 而不是 EF Core 的,迁移中没有引用(只有字符串)。我已经做过几次了,每次都很顺利。对于 EF Core,我会简单地“撤销”迁移(这也是始终使用源代码控制的原因之一)... - Christoph Fink
@starmandeluxe 抱歉如果我表达不清楚,但我并不是指“撤销迁移”,而是“撤销对迁移的更改”(因此提到了源代码控制)。但我不能谈论我不知道的东西 - 我从未使用过EF Core... - Christoph Fink
正是我的问题。正是解决它的方法。谢谢!Rename()起了作用。 - nrod
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接