首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我如何“停用”一个实体而不是使用NHibernate删除它?

我如何“停用”一个实体而不是使用NHibernate删除它?
EN

Stack Overflow用户
提问于 2010-11-03 14:59:40
回答 2查看 358关注 0票数 2

我不太确定这是否真的是琐碎的事情,我只是过于复杂的事情,但我一直在考虑这个在过去一个小时左右的大部分时间。

所以我有实体。因此,NHibernate。我想做的是,只要我想要“删除”实体,就只能“禁用”它们,而不是从数据库中实际删除它们。(只是因为我们不想真的删除数据存储中的记录)。

我的所有实体都是从具有BaseEntity属性的BaseEntity.Active类继承的。

我现在运行的是类似于实体类映射文件中的以下内容:

代码语言:javascript
运行
复制
<sql-delete>
UPDATE SomeEntityTable SET Active = 0 WHERE Id = ?
</sql-delete>

这很好,只是我必须用表名将它注入到每个实体的每个HBM映射文件中(我们没有在任何子类策略中实现BaseEntity继承)。

正如你所看到的,这可能有点卑微。编码将是乏味的,维护非常可怕,并且在同一个映射文件中两次声明表名只会让我感到不舒服。

我之前正在玩的是我是否可以实现一个事件侦听器;可能是OnPreDelete或其他什么,并更新实体的.Active属性,如下所示:

代码语言:javascript
运行
复制
class BaseEventListener : IPreDeleteListener
{
    public bool OnPreDelete(PreDeleteEvent @event)
    {
        BaseEntity be = @event.Entity as BaseEntity;
        if (be != null) 
            be.Active = false;

        return false;
    }
}

这样,所有支持失活的实体都会自动实现整个“失活”。

问题是,我认为NHibernate仍然会构建一个正确的DELETE SQL查询,这个查询无论如何都会从数据存储中烧毁我的实体,而不是更新这个东西,所以这只是浪费了automagic的努力。

我该怎么做?

EN

Stack Overflow用户

回答已采纳

发布于 2010-11-03 16:13:35

您可以使用事件侦听器。您还必须将侦听器添加到配置中。

代码语言:javascript
运行
复制
public class SoftDeleteEventListener : DefaultDeleteEventListener
    {
        protected override void DeleteEntity(IEventSource session, object entity, EntityEntry entityEntry, bool isCascadeDeleteEnabled, IEntityPersister persister, ISet transientEntities)
        {
            var softDeletable = entity as BaseEntity;
            if (softDeletable != null)
            {
                softDeletable.Active = false;
            }
            else
            {
                base.DeleteEntity(session, entity, entityEntry, isCascadeDeleteEnabled, persister, transientEntities);
            }
        }
    }
票数 3
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4088388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档