Linq-to-SQL如何防止使用Delete方法?

时间:2008-11-15 22:04:08

标签: linq linq-to-sql stored-procedures

按照惯例,我们的DB只允许使用INSERT,UPDATE和DELETE的存储过程。对于某些表/类型,没有DELETE存储过程,因为不允许删除行。 (您只能将此类型的状态更新为“已删除”)。例如客户可能被标记为已删除但从未真正从数据库中删除。

如何阻止在DMBL的数据访问层中使用Delete()?

Insert和Update的“Default Methods”映射到相应的存储过程。但对于Delete,它说“使用运行时”。我想把它设置为“不允许”。

有没有办法在数据库模型层实现这一目标?

非常感谢

4 个答案:

答案 0 :(得分:7)

为每个此类实体实现一个分部类,并实现OnValidate部分方法。它将ChangeAction作为参数。当ChangeAction是ChangeAction.Delete时,抛出一个异常,指示不允许该操作(可能是IllegalOperationException)。

答案 1 :(得分:1)

在开发我的应用程序时,我有同样的约束。您始终可以将删除操作设置为使用某个存储过程,而不是为其生成sql命令的框架。在我的情况下,当我说删除时,我们只想将特定行标记为已删除但不是物理删除它。因此,我们的更新存储过程在delete命令中重用,只是将isDeleted col值标记为true。除此之外,您可能希望围绕由DBML构建的类构建某种包装并禁止删除方法。现在我没有看到任何特殊设置让框架只生成创建和更新方法。部分类可能是另一种选择。

答案 2 :(得分:1)

如何为您用于连接数据库的用户配置权限?您可以为此特定用户设置拒绝删除操作,因此无法在数据库级别上使用DELETE语句。

答案 3 :(得分:0)

未生成删除API,我的意思是生成的表上的选项无法删除将项目标记为已删除的功能。 DeleteOnSubmitTable<TEntity>类的一部分。

如果删除实体总是出错,{t {1}}应抛出OnValidate,而tvanfosson建议。

我尝试将Linq映射到Sql删除到存储过程,只是将字段设置为true。它变得奇怪,因为InvalidOperationException在“删除”之后删除了实例,但它们是合法的域实体,在提交后仍应位于DataContext