【问题标题】: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,我的意思是生成的表上的选项无法删除将项目标记为已删除的功能。 DeleteOnSubmitTable<TEntity> 类的一部分。

          如果删除实体总是出错,OnValidate 应该按照 tvanfosson 的建议抛出 InvalidOperationException

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多