繁体   English   中英

为什么在这种情况下为Update-Database破坏了生成的Code First迁移?

[英]Why is the generated Code First Migration broken for Update-Database in this instance?

我将其中一个实体从UploadedFile重命名为File并执行了Add-Migration ,结果如下:

    public override void Up()
    {
        RenameTable(name: "dbo.UploadedFiles", newName: "Files");
        DropPrimaryKey("dbo.UploadedFiles");
        AddColumn("dbo.Files", "FileId", c => c.Int(nullable: false, identity: true));
        AddPrimaryKey("dbo.Files", "FileId");
        DropColumn("dbo.Files", "UploadedFileId");
    }

之后,我执行了Update-Database ,发现迁移将失败。 我必须重新排序其中的两个语句才能使其生效。

  1. DropPrimaryKey必须在RenameTable之前,因为生成的代码引用了旧表名
  2. 必须在AddColumn之前执行DropColumn ,否则将引发多个标识列错误。

结果就是这样,它按预期方式工作;

        DropPrimaryKey("dbo.UploadedFiles");
        RenameTable(name: "dbo.UploadedFiles", newName: "Files");
        DropColumn("dbo.Files", "UploadedFileId");
        AddColumn("dbo.Files", "FileId", c => c.Int(nullable: false, identity: true));
        AddPrimaryKey("dbo.Files", "FileId");

是否期望我需要手动编辑这些生成的迁移,或者我做错了什么会影响生成?

一次更改表名和主键是否过多,我是否应该在每个步骤中执行一次Add-Migration

这听起来像是一个错误,我建议您在codeplex上创建一个问题 在创建迁移时,EF似乎无法确定哪个语句具有更高的优先级。

当然,如果使用仅在表上命名PK Id的约定,则将完全避免此问题。 我通常发现它更具可读性,因为它可以防止PK与FK融合(例如IdOwnerIdFileIdOwnerId

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM