【问题标题】:Entity Framework relationship between entities, cycles or multiple cascade paths实体、循环或多个级联路径之间的实体框架关系
【发布时间】:2014-07-17 17:17:08
【问题描述】:

我是 EF 的新手,正在尝试使用 Code First 设计我的数据库。以下是我的三个实体(我没有写完所有属性)。我有一个颂歌的情况。管理员不允许编辑费用,因此我必须创建另一个实体 (EditedExpense) 以将所有已编辑的费用保存在另一个表中。因此,当管理员尝试更改(编辑)费用并点击保存时,EditedExpense 中将创建一个新帖子。

public class Expense
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int ExpenseId { get; set; }

    [Required]
    public int CategoryId{ get; set; }
    [ForeignKey("CategoryId")]
    public virtual Category Category { get; set; }

    public virtual List<EditedExpense> EditedExpenses { get; set; }
}
public class EditedExpense
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int EditedExpenseId { get; set; }

    [Required]
    public int CategoryId{ get; set; }
    [ForeignKey("CategoryId")]
    public virtual Category Category { get; set; }

    public int ExpenseId { get; set; }

}
public class Category
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int CategoryId{ get; set; }

    public string Title

    public virtual List<Expense> Expenses { get; set; }
    public virtual List<EditedExpense> EditedExpenses { get; set; }
}

它会产生这个错误Introducing FOREIGN KEY constraint 'Expense_EditedExpenses' on table 'EditedExpense' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints

【问题讨论】:

  • 由于 EditedExpense 是 Category 和 Expense 的子项,因此删除 Category 或 Expense 也会触发关联的 EditedExpenses 的自动(级联)删除。但是,SQL Server 不允许这样做:级联删除只能从父级之一触发,而不能从两个父级触发。因此,您必须明确删除 Category 和 EditedExpense 之间或 Expense 和 EditedExpense 之间的级联删除。您可以使用 Annotation 或使用 fluent API 来执行此操作。

标签: entity-framework foreign-key-relationship


【解决方案1】:

您需要关闭级联删除,在 CategoryEditedExpensesExpense 实体上执行此操作。

public class YourDbContext : DbContext
{
   // other code ommitted

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // Remove cascade delete from Category.
        modelBuilder.Entity<Expense>()
            .HasRequired(e => e.Category)
            .WithMany(c => c.Expenses)
            .WillCascadeOnDelete(false);

        // Or remove cascade delete from Edited Expense.
        //modelBuilder.Entity<Expense>()
        //    .HasMany(e => e.EditedExpenses)
        //    .WithRequired()
        //    .WillCascadeOnDelete(false);
    }
}

这是the explanation为什么不允许多级联。

【讨论】:

  • 我使用了您的解决方案,但是当使用 foreach 循环遍历所有费用及其 EditedPensese 及其类别时,它会抛出异常并说 ObjectContext 实例已被处置,不能再用于需要连接的操作代码如下: var costs = db.Expenses.Include(exp => exp.EditedExpenses).Include(exp => exp.Category); foreach:myexpense.myEditedExpense.Category
  • @user217648,请发布一个新问题,以便您可以更详细地解释问题,您也可以发布新代码
猜你喜欢
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
  • 2011-12-18
  • 2019-06-06
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多