问题描述
|
我有一个[产品] -1-*-[组件]。因此,当我删除产品时,我希望EF删除其所有组件。在设计器中,我选择关系并将End1的OnDelete属性设置为Cascade,其多重性为0..1-这将生成如下内容:
ALTER TABLE [dbo].[Components]
ADD CONSTRAINT [FK_ProductComponent]
FOREIGN KEY ([Product_Id])
REFERENCES [dbo].[Products]
([Id])
ON DELETE CASCADE ON UPDATE NO ACTION;
对我来说,这意味着删除某个组件时,删除操作应级联,并且相关产品也应自动删除。
这比我想要的要落后。所以我将End2的属性编辑为Cascade(End1重置为None),但是当尝试保存模型时,我得到了:
Error 28 Running transformation: End \'Text\' on relationship
\'EF.ProductComponent\' cannot have operation specified since its multiplicity
is \'*\'. Operations cannot be specified on ends with multiplicity \'*\'. C:\\Users
\\me\\Documents\\Visual Studio 2010\\Projects\\X\\Website\\Models\\EF.edmx
显然我不明白这一点。有可能做我想做的,不是吗?怎么样?
解决方法
这是一个很好的链接,详细说明了它。但简而言之,EF在处理级联删除方面不是很可靠。您应该在数据库端手动进行设置,因为EF可能没有。
http://blogs.msdn.com/b/alexj/archive/2009/08/19/tip-33-how-cascade-delete-really-works-in-ef.aspx
我的答案的第二部分是.....级联删除的工作原理是,如果删除父级,所有子级也将被删除。无论是否启用了级联删除,删除子级对父级都没有影响。
是的,ON DELETE CASCADE应该出现在子表的外键约束上。
带有良好信息的另一个链接:http://msdn.microsoft.com/zh-cn/library/ms186973.aspx