【问题标题】:Why isn't NHibernate deleting from the database?为什么 NHibernate 不从数据库中删除?
【发布时间】:2014-07-18 08:07:04
【问题描述】:

我遇到了 NHibernate 没有从数据库中删除行的问题。 Nhibernate 正在毫无问题地保存和更新到同一个数据库。

运行 SQL 分析器后,似乎没有删除 SQL 被发送到数据库 - 这让我认为这是一个配置问题,但对我来说没有什么特别突出...

配置

休眠版本: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>

谢谢

【问题讨论】:

  • 据我所知,没有办法,如何将 NHibernate 配置为插入和更新但从不删除。我敢打赌,这个问题与应用程序级别有关。我最怀疑的是,DELETE 操作没有包含在事务中,或者它没有调用 session.Flus()... 你能显示你的删除代码吗?并解释它是如何包装在事务中的?
  • 或者检查你没有mutable=false但是如果你可以更新行那么我不怀疑......
  • 能否也提供映射?
  • 您确认数据被删除了吗?也许探查器没有显示代码,因为您正在通过 batch_size 进行批量更新。只需在提交 trx 后检查删除是否发生
  • 嘿@RadimKöhler 从外观上看,删除没有包含在事务范围中: public void Delete(T entity) { using (Session) { this.Session.Delete(entity); } } 这可能是问题所在吗?更新为: public T SaveOrUpdate(T entity) { using (Session) { using (TransactionScope scope = new TransactionScope()) { Session.SaveOrUpdate(entity);范围。完成(); } 返回实体; } }

标签: c# sql nhibernate fluent-nhibernate


【解决方案1】:

根据您评论中的信息...看来您的工作方法是:

更新

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() 不完全支持强大的Update()

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

因此,即使对于Delete(),会话FlushMode 仍然被事务 提交所吸引……没有事务。这肯定是(很可能)真正的原因(怀疑)

总结,将UpdateDelete 视为双胞胎......并给予他们相同的照顾 - 即交易

【讨论】:

  • 感谢 Radim - 你成功了 :)
【解决方案2】:

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

【讨论】:

  • 谢谢,但这是一个单独的对象,不是集合的一部分
  • 你在映射中定义了id参数吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 2015-05-03
  • 2022-01-07
  • 1970-01-01
  • 2021-12-28
相关资源
最近更新 更多