我还在用英孚来搞鬼。我在项目中使用代码优先的方法,无意中发现了以下问题。
我有以下物品:
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);
}