我想用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
方法有什么缺点吗?
答案 0 :(得分:4)
您使用的是
如前所述,自动和透明的对象/关系映射与对象状态的管理有关。这意味着对象状态在内存中可用,因此直接在数据库中操作(使用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();