为什么NHibernate不从数据库中删除?

时间:2014-07-18 08:07:05

标签: c# sql nhibernate fluent-nhibernate

我遇到NHibernate没有删除数据库中的行的问题。 Nhibernate正在保存并更新到同一个数据库而没有问题。

运行SQL事件探查器后,似乎没有删除SQL被发送到数据库 - 这让我觉得这是一个配置问题,但没有什么是突出的...

配置

Nhibernate版本:3.3.1.4000 FluentNHibernate版本:1.3.0.733 SQL Server版本:2008R2

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="connection.connection_string_name">IntermediateDatabase</property>
    <property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    <property name="show_sql">true</property>
    <property name="connection.release_mode">auto</property>
    <property name="adonet.batch_size">500</property>

    <!-- Mapping assemblies -->
    <!-- Can't map it for Fluent NHibernate here; instead, load the mapping assembly in Global.asax.cs.
        If you're still using HBMs, you can use the mapping here or pass the assembly via Global.asax.cs
        as well, just like you can do with the Fluent NHibernate assembly(s). -->

  </session-factory>
</hibernate-configuration>

由于

2 个答案:

答案 0 :(得分:3)

根据您评论中的信息......您的工作方法似乎如下:

更新

public T SaveOrUpdate(T entity) 
{ 
    using (Session) 
    { 
        using (TransactionScope scope = new TransactionScope())
        { 
            Session.SaveOrUpdate(entity); scope.Complete(); 
        } 
        return entity; 
    } 
}

这绝对是正确的......因为您的会话FlushMode最有可能是:

session.FlushMode = FlushMode.Commit;

请在此处查看更多详情:Nhibernate Flush works commit doesn't

DELETE

但可怜的妹妹Delete()并不完全支持 Update()

public void Delete(T entity) 
{ 
    using (Session) 
    { 
        this.Session.Delete(entity); 
    } 
 } 

因此,即使对于Delete(),会话FlushMode仍然挂在交易提交...但没有交易。这肯定是(最有可能)真正的原因(可疑)

总结,同时将UpdateDelete视为双胞胎......并给予他们同样的关怀 - 即交易

答案 1 :(得分:1)

如果删除的对象是另一个对象集合的一部分,那么在映射中给出.Cascade.AllDeleteOrphan()并从集合中删除该项,然后nhibernate将删除语句发送给DB。