我是LINQ和EF的新手,我对我正在开发的论坛有一个简短的问题。在这个论坛上有主题,每个主题都有相关的回复。我假设EF会看到约束,删除主题时也会删除相关的回复。相反,它会抛出约束错误。有没有一种简单的方法可以删除所有相关的回复而不循环遍历它们并将每个回复标记为删除?
例如,在SQL中我会做这样的事情:
DELETE FROM topic_replies WHERE TopicID='999'
DELETE FROM topics where TopicID='999'
但在EF中,我知道这样做的唯一方法是:
Topic topic = //LINQ to get topic.
foreach (Reply reply in topic.Replies)
{
dbEntity.Replies.DeleteObject(reply);
}
dbEntity.Topics.DeleteObject(topic);
我想这很好,如果这是我必须做的。只是好奇是否有更好的方法。提前谢谢。
答案 0 :(得分:8)
您可以在EF架构中的所有者对象中设置删除级联。
<Association Name="FK_ItemChildren_Item">
<End Role="Item" Type="Model.Store.Item" Multiplicity="1">
<OnDelete Action="Cascade" />
</End>
<End Role="ItemChildren" Type="Model.Store.ItemChildren"
Multiplicity="*" />
<ReferentialConstraint>
..
</ReferentialConstraint>
</Association>
查看http://codepolice.net/2008/12/16/cascade-delete-in-entity-framework/
答案 1 :(得分:4)
在您的数据库中级联您对这些表的删除...然后当您删除父级时,数据库将处理子级的删除。
级联是外键的一部分
实施例
如果您使用SQL Server
ALTER TABLE dbo.PersonAddress ADD CONSTRAINT
FK_PersonAddress_Address FOREIGN KEY
(
AddressId
) REFERENCES dbo.Address
(
AddressId
) ON UPDATE NO ACTION
ON DELETE CASCADE -- Here is where you set your Update and Delete Actions for the foreign key constraint.
现在基本上就是这样说的;如果我删除了一个人,那么数据库将删除与该人相关的所有地址
答案 2 :(得分:2)