软删除NHibernate

3
我希望对我的数据库表进行软删除...我已经按照此处描述的方式(http://nhibernate.info/blog/2008/09/06/soft-deletes.html)和许多在 SO 上的问题中应用了以下语句。 Fattura 是我想要应用逻辑删除的表(其中没有触发器)。 Fattura.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Paggentola.Gestionale.DL.Model"   namespace="Paggentola.Gestionale.DL.Model">
  <class name="Fattura" table="Fattura"  where="Cancellato=0">
    <id name="Id_Fattura" column="Id_Fattura">
      <generator class="native" />
    </id>
    <property name="Tipo_Fattura" column="Tipo_Fattura" />
    <property name="Cancellato" column="Cancellato" />
  </class>
</hibernate-mapping>

Fattura.cs - 模型对象

using System;

namespace ModelObject
{
    public class Fattura : ISoftDeletable
    {
        public virtual int Id_Fattura { get; set; }     
        public virtual Int16 Id_Tipo_Fattura { get; set; }          
        public virtual Int16 Cancellato { get; set; }
    }
}

删除事件监听器

    public class MyDeleteEventListener : DefaultDeleteEventListener
    {
        protected override void DeleteEntity(IEventSource session, object entity,
            EntityEntry entityEntry, bool isCascadeDeleteEnabled,
            IEntityPersister persister, ISet transientEntities)
        {
            if (entity is ISoftDeletable)
            {
                var e = (ISoftDeletable)entity;
                e.Cancellato = 1;

                CascadeBeforeDelete(session, persister, entity, entityEntry, transientEntities);
                CascadeAfterDelete(session, persister, entity, transientEntities);

            }
            else
            {
                base.DeleteEntity(session, entity, entityEntry, isCascadeDeleteEnabled,
                                  persister, transientEntities);
            }
        }
    }

以这种方式配置
configuration.SetListener(ListenerType.Delete, new MyDeleteEventListener());

事件已被触发,但未将 Cancellato 设置为1。 这是我的 DeleteCommand。

   public void Delete(T entity)
    {
        NHibernateSession.Delete(entity);

        NHibernateSession.Flush();
    }

2
你需要执行 transaction.Opencommit,如果没有执行 commit,就不会将任何内容保存到数据库中。 - Harry89pl
错误是因为硬删除正常工作了... - Luigi Saggese
1
在NHibernate中进行硬删除时,内置了事务或者说是开箱即用的。 - Harry89pl
同意。你在删除方法中尝试使用事务了吗? - Miroslav Popovic
2
当然可以!不起作用...(P.S. Flush必须有相同的效果...) - Luigi Saggese
1个回答

0

我的映射文件出现了错误。属性

 <property name="Cancellato" column="Cancellato" />

我的数据库列中没有相同的名称。这样就不会更新。我只是不明白为什么在运行时没有错误...

我已经设置了相同的名称,它可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接