我正在尝试构建一个ASP.net MVC应用程序。我无法与数据注释建立某种关系。
我有3个表,Overhours
,Accountings
,Vacations
。每条Overhour
条记录都可以包含1条Accounting
或Vacation
条记录,但这是可选的。所以,它不需要有一个。这是我的Overhour
模型:
public class Overhour
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int OverhourId { get; set; }
....
public int? AccountingId { get; set; }
public virtual Accounting Accounting { get; set; }
public int? VacationId { get; set; }
public virtual Vacation Vacation { get; set; }
}
我希望在删除Vacation
记录时删除Accounting
和Overhour
记录(如果有的话)。当我像这样使用它时,级联删除被禁用。
我试过了:
public class Overhour
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int OverhourId { get; set; }
....
public virtual Accounting Accounting { get; set; }
public virtual Vacation Vacation { get; set; }
}
级联删除有效,但实体框架会创建“Accounting_AccountingId”等字段,也需要它。不应该要求这些。
我试过的最后一件事是:
public class Overhour
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int OverhourId { get; set; }
....
public int AccountingId { get; set; }
public virtual Accounting Accounting { get; set; }
public int VacationId { get; set; }
public virtual Vacation Vacation { get; set; }
}
但是这次它给我一个这样的错误:
在表xxx上引入FOREIGN KEY xxx约束可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束
我很困惑,我做错了什么?
由于
答案 0 :(得分:0)
DELETE CASCADE不能那样工作。如果删除Overhour
,则不会删除任何其他内容。它的工作方向相反。如果Accounting
是必需的相关项,并且您删除了附加到Accounting
的{{1}}实例,则还应删除Overhour
。如果外键可以为空,则不会发生这种情况,因为它将被设置为DELETE SET NULL。不过,无论哪种方式,删除Overhour
都不会对Overhour
或Accounting
个实例产生任何影响。
<强>更新强>
在这种情况下,创建一对一,这似乎是你需要的,相对容易,因为关系的一方是可选的。您所需要的只是:
Vacation
这样,删除public class Overhour
{
...
public int? AccountingId { get; set; } // optional
public virtual Accounting Accounting { get; set; }
}
public class Accounting
{
...
public int OverhourId { get; set; } // required
public virtual Overhour Overhour { get; set; }
}
也会级联并删除关联的Overhour
,因为它依赖于Accounting
。
当需要双方关系时,事情变得复杂。然后,您必须使用fluent配置将一个设置为主体,将一个设置为依赖,因为此时EF无法自行做出此决定。