【问题标题】:NHibernate delete entity - check for referencesNHibernate 删除实体 - 检查引用
【发布时间】:2011-08-10 11:55:20
【问题描述】:

当用户删除一个实体并且由于存在对它的引用而无法删除它时,是否有通用的解决方案来检查引用? 我搜索适用于所有情况的解决方案。用户尝试删除,我可以签入我的 DataAccess-Layer 并给用户一条消息“实体无法删除,因为有引用”。你如何解决这个问题?

【问题讨论】:

    标签: c# nhibernate reference


    【解决方案1】:

    如果您不需要知道引用是什么,您可以在 DAL 中捕获 FK 异常,并将其包装到您的服务层到 ReferencedObjectsException 中,并带有适当的错误消息。

    否则,您将不得不查看映射(按代码)、确定引用(按代码)并检查依赖关系(按代码)。

    Rhino.Security 在这里有一个映射重写部分:https://github.com/ayende/rhino-security/blob/master/Rhino.Security/Impl/MappingRewriting/UserMapper.cs,从 NHibernate 配置对象,您可以访问类映射。

    【讨论】:

    • 有一个例子,我如何查看映射并通过代码确定引用?
    • 更新了我的答案。您应该能够从给定的链接中解决问题。
    【解决方案2】:

    您需要映射相关实体并包含cascade='all-delete-orphan' 选项。

    【讨论】:

    • 并不总是一个好主意。假设您有带标签的问题。用户错误地删除了一个标签,你的问题就消失了。
    • 如果您在Question-Tag 连接表上有一个多对多连接实体,则应删除该实体并删除QuestionTag,但映射不应指示当Question-Tag 被删除时,TagQuestion 应该被删除。
    • 好的,假设每个问题只能有 1 个标签。当标签被删除时,如果你级联删除,所有关联的问题也会被删除。
    • 我不知道你为什么要在这种情况下建立外键关系,但是是的,那将是你不想做'all-delete-orphan' 的领域。相反,您希望将问题的 Tag 属性的 <many-to-one> 映射为 not-found='ignore'
    • 不,我只是说有时候,当你删除一个实体时,你不应该级联删除,因为它可能会擦除你一半的数据库:D
    猜你喜欢
    • 2012-08-29
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多