【发布时间】: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