在一对多关系上级联删除

时间:2011-05-28 00:57:29

标签: sql-server entity-framework-4.1

我有[产品] -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
显然我不明白这一点。可以做我想做的事,不是吗?如何?

1 个答案:

答案 0 :(得分:3)

这是一个很好的链接,可以详细解释它。但简而言之,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/en-us/library/ms186973.aspx

相关问题