1

我有这两个实体

class AUT
{
    public Guid ID { get; set; }
    public string Name { get; set; }

    public Engineer Engineer { get; set; }
}

class InstallationSetup
{
    public virtual AUT ApplicationUnderTesting { get; set; }

    public Guid ID { get; set; }
    // Loads of properties etc
}

class Engineer
{
    public Guid ID { get; set; }
    public string Name { get; set; }
}

使用代码优先和一些数据注释,这些实体创建了一个数据库。我正在使用 EF 5,当我删除一个应用程序时,它应该只删除它自己和任何引用它的 InstallationSetup。它不应该删除工程师。但是,当我尝试删除它时,出现错误:

DELETE 语句与 REFERENCE 约束“FK_dbo.InstallationSetups_dbo.AUTs_ApplicationUnderTesting_ID”冲突。冲突发生在数据库“UXLab”、表“dbo.InstallationSetups”、列“ApplicationUnderTesting_ID”中。该语句已终止。

所以,我猜是因为有另一个表的条目依赖于 AUT 存在,通过删除 AUT,您将留下带有空外键的 InstallationSetup,因此是一个损坏的行。

我应该能够(最好不使用 Fluent API)告诉实体框架任何引用 AUT 的东西也应该被删除?这就是我想要实现的。

4

1 回答 1

2

您只需添加与生成的外键列类似的列,当实体框架生成此 FK 列时,它会将级联删除设置为禁用。

class AUT
{
   public Guid ID { get; set; }
   public string Name { get; set; }

  public Engineer Engineer { get; set; }
}

class InstallationSetup
{
    public virtual AUT ApplicationUnderTesting { get; set; }
    public int ApplicationUnderTestingId {get; set;}   <--- Add this.

   public Guid ID { get; set; }
// Loads of properties etc
}

class Engineer
{
 public Guid ID { get; set; }
 public string Name { get; set; }
}

如果您再次生成数据库,您会发现有些事情发生了变化。自动生成的 AUTs_ApplicationUnderTesting_ID 列不再存在,ApplicationUnderTestingId 列现在用于您的外键关系。

EF 现在将自动启用级联删除。

于 2013-03-18T14:46:42.170 回答