6

我正在使用 Linq to SQL 来访问我的数据库。我想要一个“删除帐户”功能,它基本上可以删除属于给定用户的所有表中的所有记录。这样做最有效的方法是什么?

删除必须按一定顺序进行,否则会出现外键完整性错误。我可以从数据库手动执行此操作,我的猜测是在 L2S 中简单地模拟它,例如(伪代码)

var tb1del = From Table1 Where userId == userIdToDelete;
mydatacontext.Table1.deleteonsubmit(tb1del);

var tb1de2 = From Table1 Where userId == userIdToDelete;
mydatacontext.Table2.deleteonsubmit(tb1de2);
...

但是,我确信这不是删除记录的最有效方法。

4

3 回答 3

6

最简单的解决方案就是在数据库中创建一个FOREIGN KEY约束ON DELETE CASCADE。这样您就不必担心删除顺序或其他任何事情。只需删除帐户记录即可。

于 2010-03-03T03:20:51.527 回答
2

如果有少量表并且属于用户的数据不多,那么您可以在 LINQ to SQL 中发出命令。我所说的“不多”是指一些几乎没有变化的记录,例如登录信息、地址信息和偏好。理想情况下,您希望将所有这些逻辑放在一起,以确保这些步骤始终按预期顺序执行。即使是这种情况,仍然可以使用存储过程。

另一方面,如果预计数据会很多,例如拥有多个帖子、评论、收藏夹、书签等的论坛用户,那么我建议使用一个存储过程,该过程获取用户 ID 并将其余部分作为需要。问题是每个匹配的记录都会发出一个删除语句。这就是导致性能比在一个语句中删除与用户 ID 关联的所有记录的删除语句更差的原因。

选项 #1:使用存储过程

您可以将存储过程映射到您的 DataContext,这使您能够将其用作dc.DeleteUserAccount(userId). Scott Gu 有一篇出色的博客文章可以帮助您入门:LINQ to SQL(第 6 部分 - 使用存储过程检索数据)

选项 #2:使用 Terry Aney 的批量更新代码

Terry Aney 有一篇很棒的博客文章,讨论了他开发使用 LINQ to SQL 以有效方式批量更新和删除能力的经验。代码不会为每个匹配的记录生成单个更新/删除语句,而是按照我们通常编写它们的方式为所有记录生成单个语句。可以在此处找到帖子和代码:使用 LINQ to SQL 批量更新和删除

选项 #3:使用 DataContext.ExecuteCommand 方法

DataContext.ExecuteCommand方法可用于直接执行SQL,如:

int affectedRecords = 
    dc.ExecuteCommand("Update Person SET FirstName = {0} WHERE FirstName = {1}", "Foo", "Bar");

注意允许输入参数化的{0}和的使用。{1}使用它而不是连接来防止 SQL 注入攻击。

如果您要使用它,那么您不妨选择选项#1。

于 2010-03-03T02:11:55.447 回答
2

Aaronaught 是正确的,但是对于那些想知道如何在 Microsoft SQL Server Management Studio 中执行此操作的人,我附上了一个屏幕截图,其中描述了此操作的位置。

右键单击所需的表,单击Relationships按钮,单击其中一个关系并展开INSERT And UPDATE Spesification下面的Table designer

然后选择Delete rule=Cascade就完成了。每次从该表中删除记录时,您选择级联的所有外键项也将被删除。

替代文字

于 2010-09-22T12:22:02.793 回答