实体框架外键约束

4

我很想了解如何使用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; }
}

两者都包含BusinessUnit属性,看起来EF不想允许这样做。当执行带有许多includes的Linq查询时,Index()方法会出现以下错误。

“引入FOREIGN KEY约束'FK_dbo.Quotes_dbo.BusinessUnits_BusinessUnitId'到表'Quotes'上可能导致循环或多个级联路径。指定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; }
}

你能发布 BusinessUnit 类的代码吗? - Jeremy Todd
https://dev59.com/WHRA5IYBdhLWcg3wuAYo - Oskar
你定义了哪些DbSets?你的 OnModelCreate 被覆盖后有什么内容? - nullforce
为什么在报价和员工类中包含int BusinessUnitId?我猜这是int属性和BusinessUnit属性之间的冲突。 - Daniel
一个员工和一份报价属于一个业务单元。 - FreddieGericke
我认为这可能是因为如果员工和报价引用相同的业务单位,则无法删除报价。尝试将其中一种关系设置为可选。 - undefined
3个回答

5

现在,如果您尝试删除员工,它会尝试删除报价、该报价的业务单元,然后是该业务单元的员工等。

可以将某些关系设置为可选,或按如下关闭级联约定:

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

0

作为答案添加评论:这是 BusinessUnitId 属性和 BusinessUnit 属性之间的冲突

从报价和员工类中删除 BusinessUnitId 属性


0

这个问题的核心是SQL Server拒绝允许循环引用级联删除(正如@Oskar的SO链接所讨论的那样)。EF正在将来自SQL Server的异常传递给您。它是由Code First的默认行为触发的:“如果从属实体上的外键不可为空,则Code First在关系上设置级联删除。如果从属实体上的外键可为空,则Code First不会在关系上设置级联删除,当主体被删除时,外键将被设置为null。

您可以通过使Quote或Employee中的BusinessUnitId属性之一可为空来克服此问题。或者,您可以使用EF的流畅API指定级联删除规则。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接