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

NHibernate:DeleteById使用HQL不会从会话缓存中删除实体,nhibernate,Nhibernate,我想用NHibernate实现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)

我想用NHibernate实现
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);
}
public void Delete<T>(T instance) where T : BaseEntity
{
    nhSession.Delete(instance);
}
这不是扩展方法,也不使用
HQL
。这将正确更新
nhSession.Statistics.EntityCount
。调用前,计数为1,调用后,计数重置为0,这是预期值

那么这意味着什么呢?HQL不更新会话级缓存?或者它只是不更新统计数据


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

您使用的方法称为

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

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

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


您正在使用的被称为

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

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

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


因此,这意味着它不会更新会话缓存。正当这也意味着它将在程序的其他部分产生问题。对的关于类似的问题,请参考我的另一个问题。那么什么是好的解决方案呢?我不确定我是否可以评论:“……它会在程序的其他部分产生问题……”。Simply DML旨在帮助我们进行批量编辑,而无需将数据从DB加载到应用层。我们可以把它看作是一个无状态会话。所以,如果DML用于。。。在任何
i会话
假设之外。这应该是答案的一部分:“……那么什么是好的解决方案……”*。将此类操作用作独立语句。。。任何会议都应该在这之前或之后持续。。。希望它能帮助一位用户,这意味着它不会更新会话缓存。正当这也意味着它将在程序的其他部分产生问题。对的关于类似的问题,请参考我的另一个问题。那么什么是好的解决方案呢?我不确定我是否可以评论:“……它会在程序的其他部分产生问题……”。Simply DML旨在帮助我们进行批量编辑,而无需将数据从DB加载到应用层。我们可以把它看作是一个无状态会话。所以,如果DML用于。。。在任何
i会话
假设之外。这应该是答案的一部分:“……那么什么是好的解决方案……”*。将此类操作用作独立语句。。。任何会议都应该在这之前或之后持续。。。希望能有点帮助
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();