Code First Cascade删除不使用Fluent API

时间:2013-03-18 14:23:58

标签: c# asp.net-mvc entity-framework

我有这两个实体

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保留为null外键,从而导致行断开。

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

1 个答案:

答案 0 :(得分:3)

您只需要添加一个与生成的外键列类似的列,当实体框架生成此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现在会自动启用级联删除。