我还在用英孚来搞鬼。我在项目中使用代码优先的方法,无意中发现了以下问题。
我有以下物品:

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; }
}

两者都包含一个businessunit属性,而且ef似乎不允许这样做。看到在执行包含一组include的linq查询时,index()方法出现以下错误。
引入外键约束
表上的“fk_dbo.quotes_dbo.businessunits_businessunitid”
“引号”可能导致循环或多个级联路径。删除时指定
无操作或更新时无操作,或修改其他外键
约束条件。无法创建约束。请参阅以前的错误。
有人能给我解释一下为什么我会犯这个错误吗?谢谢。
编辑:
这是由于在quote对象和employee对象中都包含businessunit属性而导致的。我只是不明白为什么。
编辑2:
businessunit类的代码:
public class BusinessUnit
{
    public int BusinessUnitId { get; set; }
    public string Name { get; set; }
}

最佳答案

现在,如果您尝试删除一个员工,它将尝试删除报价、该报价的业务单元,然后删除该业务单元的员工,等等。
将某些关系设为可选,或关闭级联约定,如下所示:

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);
}

10-08 06:41