NHibernate:使用HQL的DeleteById不会从会话缓存中删除实体

时间:2017-01-09 10:43:26

标签: nhibernate

我想用NHibernate实现import requests方法。我是通过扩展方法完成的,如下所示:

DeleteById

这很有效;没问题。但我观察到这并没有改变会话的统计数据。

我使用public static void Delete<TEntity>(this ISession nhSession, object id) { var queryString = string.Format("DELETE {0} WHERE id = :id", typeof(TEntity)); nhSession.CreateQuery(queryString) .SetParameter("id", id) .ExecuteUpdate(); } public void DeleteById<T>(Guid id) where T : BaseEntity { nhSession.Delete<T>(id); } 方法在内存中加载实体。然后,我用Get删除它。但DeleteById在调用nhSession.Statistics.EntityCount方法之前和之后返回相同的计数。

我还有其他方法删除记录如下:

DeleteById

这不是扩展方法,并且不使用public void Delete<T>(T instance) where T : BaseEntity { nhSession.Delete(instance); } 。这会正确更新HQL。在呼叫之前,count为1,然后重置为0,这是预期的。

那是什么意思? HQL不更新会话级缓存?或者它只是不更新​​nhSession.Statistics.EntityCount

使用Statistics方法有什么缺点吗?

1 个答案:

答案 0 :(得分:4)

您使用的是

13.3. DML-style operations

  

如前所述,自动和透明的对象/关系映射与对象状态的管理有关。这意味着对象状态在内存中可用,因此直接在数据库中操作(使用SQL数据操作语言(DML)语句:INSERT,UPDATE,DELETE)数据不会影响内存状态 ....

     

...

进一步阅读将显示删除示例

  

要执行HQL DELETE,请使用相同的IQuery.ExecuteUpdate()方法:

ISession session = sessionFactory.OpenSession();
ITransaction tx = session.BeginTransaction();

String hqlDelete = "delete Customer c where c.name = :oldName";
// or String hqlDelete = "delete Customer where name = :oldName";
int deletedEntities = s.CreateQuery( hqlDelete )
        .SetString( "oldName", oldName )
        .ExecuteUpdate();
tx.Commit();
session.Close();