我正在使用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);
...
但是,我确信这不是删除记录的最有效方法。
答案 0 :(得分:6)
最简单的解决方案是在数据库中使用FOREIGN KEY
创建ON DELETE CASCADE
约束。这样您就不必担心删除顺序或其他任何问题。只需删除帐户记录即可。
答案 1 :(得分:2)
如果有少量表并且属于该用户的数据不多,那么您可以在LINQ to SQL中发出命令。 “不是很多”我指的是一些几乎没有变化的记录,例如登录信息,地址信息和偏好。理想情况下,您希望将所有这些逻辑保持在一起,以确保步骤始终按预期顺序执行。即使是这种情况,仍然可以使用存储过程。
另一方面,如果数据预计会很多,例如论坛用户有多个帖子,评论,收藏夹,书签等,那么我建议使用一个带有用户ID的存储过程。其余的根据需要。关注的是为每个匹配记录发出一个删除语句。这就是导致性能较差的原因,而删除语句删除了一个语句中与用户ID关联的所有记录。
选项#1:使用存储过程
您可以将存储过程映射到DataContext,这样您就可以将其用作dc.DeleteUserAccount(userId)
。 Scott Gu有一篇很棒的博客文章可以帮助你入门:LINQ to SQL (Part 6 - Retrieving Data Using Stored Procedures)。
选项#2:使用Terry Aney的批量更新代码
Terry Aney有一篇很棒的博客文章,讨论了他以高效的方式开发使用LINQ to SQL批量更新和删除的能力。代码不会为每个匹配记录生成单个更新/删除语句,而是为我们通常编写它们的方式生成所有记录的单个语句。帖子和代码可以在这里找到:Batch Updates and Deletes with LINQ to SQL。
选项#3:使用DataContext.ExecuteCommand方法
DataContext.ExecuteCommand method可用于直接执行SQL,例如:
int affectedRecords =
dc.ExecuteCommand("Update Person SET FirstName = {0} WHERE FirstName = {1}", "Foo", "Bar");
请注意使用允许输入参数化的{0}
和{1}
。使用它而不是连接来防止SQL注入攻击。
如果您打算使用它,那么您也可以使用选项#1。
答案 2 :(得分:2)
Aaronaught是正确的,但对于那些想知道如何在Microsoft SQL Server Management Studio中执行此操作的人,我附上了一个屏幕截图,其中描述了在何处。
右键单击所需的表格,点击Relationships
按钮,点击其中一个关系,然后展开INSERT And UPDATE Spesification
下的Table designer
。
然后选择Delete rule
= Cascade
,您就完成了。每次从此表中删除记录时,您选择级联的所有外键项也将被删除。