实体框架外键约束

Fre*_*cke 4 c# asp.net-mvc entity-framework

我仍然在使用EF.我在我的项目中使用代码优先方法并偶然发现了以下问题.

我有以下对象:

public class Employee
{
    public int EmployeeId { get; set; }
    public int BusinessUnitId { get; set; }

    public virtual BusinessUnit BusinessUnit { get; set; }
}

public class Quote
{
    public int QuoteId { get; set; }

    [DisplayName("Business Unit")]
    public int BusinessUnitId { get; set; }

    [DisplayName("Responsible Employee")]
    public int EmployeeId { get; set; }

    [DisplayName("Date Issued")]
    [DataType(DataType.Date)]
    public DateTime DateIssued { get; set; }

    [DataType(DataType.MultilineText)]
    public string Description { get; set; }

    public virtual Employee Employee { get; set; }
    public virtual BusinessUnit BusinessUnit { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

两者都包含BusinessUnit属性,似乎EF不想允许这样做.当执行带有一堆包含的Linq查询时,看到我在Index()方法下面得到以下错误.

在表'Quotes'上引入FOREIGN KEY约束'FK_dbo.Quotes_dbo.BusinessUnits_BusinessUnitId'可能会导致循环或多个级联路径.指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束.无法创建约束.查看以前的错误.

有人可以向我解释为什么我会收到此错误以及我可能会如何修复它.谢谢.

编辑:

这绝对是由于在Quote对象和Employee对象中都包含BusinessUnit属性.我只是不明白为什么.

编辑2:

BusinessUnit类的代码:

public class BusinessUnit
{
    public int BusinessUnitId { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

nul*_*rce 5

现在,如果您尝试删除Employee,它将尝试删除Quote,该Quote的BusinessUnit,然后删除该BusinessUnit的Employees等.

要么使某些关系可选,要么关闭级联约定,如下所示:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // Either entirely
    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

    // or for one model object
    modelBuilder.Entity<Person>()
       .HasRequired(p => p.Department)
       .WithMany()
       .HasForeignKey(p => p.DepartmentId)
       .WillCascadeOnDelete(false);
}
Run Code Online (Sandbox Code Playgroud)