我们的架构包含一个带有复合主键的表。该实体没有任何版本/时间戳列。映射是:
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()
删除实体。
我们应该如何重写代码以避免在删除时过度查询数据库?
答案 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();
}