删除时无法确定实体是暂时的还是分离的

时间:2017-10-09 06:18:54

标签: nhibernate

我们的架构包含一个带有复合主键的表。该实体没有任何版本/时间戳列。映射是:

mapping.CompositeId().KeyReference(e => e.ParentEntity).KeyProperty(e => e.DTFR);

当用户单击“删除”按钮时,HTTP请求将发布到服务器,服务器将创建新的NHibernate会话并调用session.Delete()

        using (var session = SessionFactory.OpenSession())
        using (var trans = session.BeginTransaction())
        {
            foreach (var entity in entities)
                session.Delete(entity);
            return trans.TryCommit();
        }

但NHibernate发出警告:

  

无法确定具有指定标识符{Entity}的{Entity}是否为   暂时的或分离的;查询数据库。使用显式Save()或   在会话中更新()以防止这种情况。

并在删除之前从数据库加载实体。

我们无法遵循警告中的建议,并使用Save()Update()删除实体。

我们应该如何重写代码以避免在删除时过度查询数据库?

1 个答案:

答案 0 :(得分:1)

我认为这是因为你用来删除实体的NH会话并不知道/不会跟踪它们。

对于删除,需要HQL查询的Delete() method重载。这可能是一种可行的,可以说更有效的方式来做你想做的事情吗?

类似的东西:

using (var session = SessionFactory.OpenSession())
using (var trans = session.BeginTransaction())
{
    session.Delete($"FROM EntityTable WHERE Id IN ({entities.Select(e => e.Id})");

    return trans.TryCommit();
 }