我不太确定这是否真的是琐碎的事情,我只是过于复杂的事情,但我一直在考虑这个在过去一个小时左右的大部分时间。
所以我有实体。因此,NHibernate。我想做的是,只要我想要“删除”实体,就只能“禁用”它们,而不是从数据库中实际删除它们。(只是因为我们不想真的删除数据存储中的记录)。
我的所有实体都是从具有BaseEntity
属性的BaseEntity.Active
类继承的。
我现在运行的是类似于实体类映射文件中的以下内容:
<sql-delete>
UPDATE SomeEntityTable SET Active = 0 WHERE Id = ?
</sql-delete>
这很好,只是我必须用表名将它注入到每个实体的每个HBM映射文件中(我们没有在任何子类策略中实现BaseEntity
继承)。
正如你所看到的,这可能有点卑微。编码将是乏味的,维护非常可怕,并且在同一个映射文件中两次声明表名只会让我感到不舒服。
我之前正在玩的是我是否可以实现一个事件侦听器;可能是OnPreDelete
或其他什么,并更新实体的.Active
属性,如下所示:
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的努力。
我该怎么做?
发布于 2010-11-03 16:13:35
您可以使用事件侦听器。您还必须将侦听器添加到配置中。
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);
}
}
}
https://stackoverflow.com/questions/4088388
复制相似问题