' PK_dbo.EntityName'不是约束。无法删除constraint.EF6

时间:2016-08-20 20:17:49

标签: entity-framework-6 code-first

我首先使用Entity Framework 6代码。我有三个这样的实体:

public class Doctor
{
    public string DoctorID { get; set; } 
    public string firstName { get; set; }
    public string lastName { get; set; }
 }

public class ExpertiseDetails
{
    [Key, Column(Order = 1)]
    public short expertiseID { get; set; }
    [Key , Column(Order = 2)]
    public string DoctorID { get; set; }

    [ForeignKey("expertiseID")]
    public Expertise expertise { get; set; }
    public Doctor doctor { get; set; }
}


public class Expertise
{
    [Key]
    public short expertiseID { get; set; }
    public string expertiseTitle { get; set; }
}

我需要one to manyExpertise之间的Doctor关系,当我在控制台nuGet中运行update-database语句时,此错误显示:

'PK_dbo.ExpertiseDetails' is not a constraint. Could not drop constraint

出了什么问题?

2 个答案:

答案 0 :(得分:2)

在重命名表模式后经历过类似的问题,我解决了用sql显式删除PK名称。

在我的情况下,在重命名表模式后在表中更改了主键时出现了问题:

原件:

  • dbo.LogEntries with PK-name:PK_dbo.LogEntries

第1步:架构更改:

  • Logging.LogEntries,PK不变

第2步:改变PK

  • PK已更改:结果为DropPrimaryKey("Logging.LogEntries");

最后一行转换为PK名称:PK_Logging.LogEntries,但不存在。

修复: 一般来说,有几种方法可以解决这个问题。我在显式迁移中通过sql语句删除了PK。

Sql("ALTER TABLE [Logging].[LogEntries] DROP CONSTRAINT [PK_dbo.LogEntries]");

建议;我有完整的生产访问权限,以防它失败并且没有使用迁移回滚到以前的状态。

答案 1 :(得分:0)

here所述,默认名称可能与您的数据库不匹配。在这种情况下,文档说要手动修改迁移文件(UpDown方法)以使用name参数,该参数将覆盖主文件名或外部文件名的默认名称。键(或其他数据库对象,具体取决于情况)。

例如,对于我来说,生成的行:

DropPrimaryKey("dbo.MyTable");

成为:

DropPrimaryKey("dbo.MyTable", "PK_MyTable");