【问题标题】:Change composite primary key to single field primary key with code first migration使用代码优先迁移将复合主键更改为单字段主键
【发布时间】:2017-02-15 10:56:27
【问题描述】:

我有这个实体:

    public class GWDetail: Entity
{
    public int? GWNR { get; set; }
    public double? PRNR { get; set; }
    public double? GWO { get; set; }
    public double? GWU { get; set; }

}

使用复合 PK 映射

        // Primary Key
        HasKey(t => new { t.PRNR, t.GWNR });

并想将其更改为:

    public class GWDetail: Entity
{
    public int? GWNR { get; set; }
    public int? PRNR { get; set; }   // change from double to int !!
    public double? GWO { get; set; }
    public double? GWU { get; set; }

}

            // Primary Key
        HasKey(t => t.Id)

我已经创建了 add-migration 脚本并应用了 update-database 但得到:

错误号:5074,状态:1,类:16 对象“PK_dbo.GWDetail”取决于列“PRNR”。 ALTER TABLE ALTER COLUMN PRNR 失败,因为一个或多个对象访问此列。

GWDetail 还没有任何记录。但是有一个父表通过 GWNR 与它具有 1:n 关系。父表有记录。

有人可以帮我解决这个问题吗? 谢谢和问候,马努

【问题讨论】:

    标签: asp.net-mvc-4 entity-framework-6 entity-framework-migrations


    【解决方案1】:

    我自己通过更改迁移脚本中的操作顺序解决了这个问题。

    这是 EF 创建的脚本:

            public override void Up()
        {
            AddColumn("dbo.GWDetails", "Id", c => c.Int(nullable: false, identity: true));
            AlterColumn("dbo.GWDetails", "PRNR", c => c.Int(nullable: false));
            AlterColumn("dbo.GWDetails", "GWNR1", c => c.Int());
            DropPrimaryKey("dbo.GWDetails", new[] { "PRNR", "GWNR1" });
            AddPrimaryKey("dbo.GWDetails", "Id");
        }
    

    这里是我用来更新数据库的脚本:

            public override void Up()
        {
            DropPrimaryKey("dbo.GWDetails", new[] { "PRNR", "GWNR1" });
            AlterColumn("dbo.GWDetails", "PRNR", c => c.Int(nullable: false));
            AlterColumn("dbo.GWDetails", "GWNR1", c => c.Int());
            AddColumn("dbo.GWDetails", "Id", c => c.Int(nullable: false, identity: true));
            AddPrimaryKey("dbo.GWDetails", "Id");
        }
    

    关键行动是:

    DropPrimaryKey("dbo.GWDetails", new[] { "PRNR", "GWNR1" });
    

    我必须将其放入脚本的第一行。我不明白为什么 EF 会在旧密钥仍然存在时尝试创建新密钥。 问候,马努

    【讨论】:

      猜你喜欢
      • 2020-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多