EF迁移:将表从2列PK移动到单列会导致DROP之前的ALTER并失败

Chr*_*ini 6 ef-code-first ef-migrations

我正在使用EF 4.3.1 Code First Migrations.我有一张桌子:

public class Product
{
    [Key]
    [Column(Order=0)]
    [MaxLength(100)]
    public string Store { get; set; }

    [Key]
    [Column(Order=1)]
    [MaxLength(100)]
    public string Sku { get; set; }
}?
Run Code Online (Sandbox Code Playgroud)

我有一个使用上面的代码创建的现有表.然后我将其移动到单列主键:

public class Product
{
    [MaxLength(100)]
    public string Store { get; set; }

    [Key]
    [MaxLength(100)]
    public string Sku { get; set; }
}?
Run Code Online (Sandbox Code Playgroud)

这导致EF在下一次自动迁移中失败,抱怨:

ALTER TABLE [产品] ALTER COLUMN [Store] nvarchar

对象'PK_Product'依赖于列'Store'.ALTER TABLE ALTER COLUMN存储失败,因为一个或多个对象访问此列.

显然,在尝试触发此ALTER语句之前需要删除PK_Product(为什么它根本不改变列?),而是迁移失败.

我做错了什么或这是一个错误?解决方法?

Die*_*hon 13

您无法通过自动迁移执行此操作.您必须使用Add-Migration然后更改它来创建迁移,以便它只修改PK.

迁移可以很简单:

public partial class TheMigration : DbMigration
{
    public override void Up()
    {
        DropPrimaryKey("Products", new[] { "Store", "Sku" });
        AddPrimaryKey("Products", "Sku");
    }

    public override void Down()
    {
        DropPrimaryKey("Products", new[] { "Sku" });
        AddPrimaryKey("Products", new[] { "Store", "Sku" });
    }
}
Run Code Online (Sandbox Code Playgroud)

EF正在改变列,因为当它是a的一部分时Key,它是隐含的NOT NULL.您可以保留原样,添加[Required]属性,或允许EF 在删除PK 后更改列.