【问题标题】:Linq-to-SQL How to prevent the use of Delete methods?Linq-to-SQL 如何防止使用 Delete 方法?
【发布时间】:2008-11-15 22:04:08
【问题描述】:
按照惯例,我们的数据库只允许使用存储过程进行 INSERT、UPDATE 和 DELETE。对于某些表/类型,没有 DELETE 存储过程,因为不允许删除行。 (您只能将此类类型的状态更新为“已删除”)。例如客户可能被标记为已删除,但从未真正从数据库中删除。
如何防止对数据访问层中的某些类型使用 Delete() = 在 DMBL 中?
插入和更新的“默认方法”映射到相应的存储过程。但是对于删除它说“使用运行时”。我想将其设置为“不允许”。
有没有办法在 DB 模型层实现这一点?
非常感谢
【问题讨论】:
标签:
linq
linq-to-sql
stored-procedures
【解决方案1】:
为每个这样的实体实现一个分部类并实现 OnValidate 分部方法。它将 ChangeAction 作为参数。当 ChangeAction 为 ChangeAction.Delete 时,抛出一个异常,表示该操作被禁止(IllegalOperationException,可能)。
【解决方案2】:
在开发我的一个应用程序时,我遇到了同样的限制。您始终可以配置删除操作以使用某个存储过程,而不是框架为其生成 sql 命令。就我而言,当我说删除时,我们只是想将特定行标记为已删除,而不是物理删除它。所以我们的更新存储过程在删除命令中被重用,简单地将 isDeleted col 值标记为 true。除此之外,您可能希望围绕 DBML 构建的类构建某种包装器并禁止删除方法。现在我没有看到任何特殊设置让框架只生成创建和更新方法。部分类可能是另一种选择。
【解决方案3】:
如何为您用来连接数据库的用户配置权限?您可以为该特定用户设置拒绝删除操作,因此无法在数据库级别使用 DELETE 语句。
【解决方案4】:
没有生成删除 API,我的意思是生成的表上的选项无法删除将项目标记为已删除的功能。 DeleteOnSubmit 是 Table<TEntity> 类的一部分。
如果删除实体总是出错,OnValidate 应该按照 tvanfosson 的建议抛出 InvalidOperationException。
我尝试将 Linq 到 Sql 删除映射到存储过程,该存储过程只是将字段设置为 true。这很奇怪,因为DataContext 在“删除”后删除了实例,但它们是合法的域实体,提交后仍应在DataContext 中。