2011-05-28 140 views
3

我有一个[Product] -1 - * - [Component]。所以当我删除一个产品时,我想让EF删除它的所有组件。在设计师,我选择的关系,并为END1至级联,其多样性是0..1的OnDelete财产 - 这会产生类似:级联删除一对多关系

ALTER TABLE [dbo].[Components] 
ADD CONSTRAINT [FK_ProductComponent] 
    FOREIGN KEY ([Product_Id]) 
    REFERENCES [dbo].[Products] 
     ([Id]) 
    ON DELETE CASCADE ON UPDATE NO ACTION; 

这对我来说,是指当一个组件被删除,删除应级联,相关产品也应自动删除。

这是从我想要的倒退。所以,我编辑的END2串级属性(END1被重置为无),但试图保存模型,我得到的时候:

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 

清楚,我不明白这一点。有可能做我想做的事,不是吗?怎么样?

+2

在上面你向后理解它。通过对外键约束应用“on delete”,你说......如果父母被删除,也删除我。 – RThomas 2011-05-28 03:49:59

回答

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

+0

我读过这个链接,但是并没有发现EF创建FK_ProductComponent约束的事实,删除级联完成了Golden Rule#1?我的问题是产品被删除时应该发生级联,而不是组件时,但EF不允许我表达这种情况... – ekkis 2011-05-28 03:38:54

+0

如果您已验证显示的约束实际存在于服务器上,则如图所示它应该做你所描述的。你有没有测试过,发现不同。你说你修改了属性并且有错误,但是你测试了它吗? – RThomas 2011-05-28 03:45:45

+1

我想出了我不明白的东西......查找关于添加外键约束的文档。设置ON DELETE CASCADE表示删除父表时删除表中的行将被删除。我在想,需要将约束添加到父表中,而不是依赖关系。但是,这只是我愚蠢 - 你没有指出,我想我们只看到我们想看到的。:) – ekkis 2011-05-28 03:57:21