【问题标题】:Entity framework foreign key constraint实体框架外键约束
【发布时间】:2013-05-23 22:40:06
【问题描述】:

我仍在努力使用 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 似乎不想允许这样做。看到在执行包含一堆包含的 Linq 查询时,我在 Index() 方法上收到以下错误。

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

【问题讨论】:

  • 你能贴出BusinessUnit类的代码吗?
  • 您定义了哪些 DbSet,您覆盖的 OnModelCreate 包含哪些内容?
  • 为什么在 Quote 和 Employee 类中包含 int BusinessUnitId?我的猜测是 int 属性和 BusinessUnit 属性之间存在冲突
  • 一个员工和一个报价属于一个业务部门。

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    从 Quote 和 Employee 类中删除 BusinessUnitId 属性

    【讨论】:

      【解决方案3】:

      这个问题的核心是 SQL Server 拒绝允许循环引用级联删除(正如@Oskar 的 SO 链接所讨论的那样)。 EF 正在将异常从 SQL Server 转发给您。它是由代码优先的默认行为触发的:“If a foreign key on the dependent entity is not nullable, then Code First sets cascade delete on the relationship. If a foreign key on the dependent entity is nullable, Code First does not set cascade delete on the relationship, and when the principal is deleted the foreign key will be set to null.

      您应该能够通过在 Quote 或 Employee 上将至少一个 BusinessUnitId 属性设为 null 来解决此问题。或者,您可以使用 EF 的 fluent api 指定cascade delete 规则。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-05
        • 1970-01-01
        • 2017-10-27
        • 1970-01-01
        • 2012-10-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多