Nhibernate探查器显示一条警告;在会话中使用显式保存或更新“;

Nhibernate探查器显示一条警告;在会话中使用显式保存或更新“;,nhibernate,session,warnings,profiler,Nhibernate,Session,Warnings,Profiler,我在保存第一次创建的会话实体时遇到问题 每个实体都有一个步骤列表,每个步骤都有一个值列表。(我在映射上使用逆)。此外,实体和步骤引用数据库中已有的主值。所以有一种新旧物体的混合 当我执行第一次保存时,我执行Session.Save(entity),整个树保存在数据库中 问题在于探查器会警告如下消息 无法确定指定标识符为ede6a5ee-b4bd-4f67-9c64-11ef85b7d6ff的StepValueEntity是瞬时的还是分离的;查询数据库。在会话中使用显式Save()或Update(

我在保存第一次创建的会话实体时遇到问题

每个实体都有一个步骤列表,每个步骤都有一个值列表。(我在映射上使用逆)。此外,实体和步骤引用数据库中已有的主值。所以有一种新旧物体的混合

当我执行第一次保存时,我执行
Session.Save(entity)
,整个树保存在数据库中

问题在于探查器会警告如下消息

无法确定指定标识符为ede6a5ee-b4bd-4f67-9c64-11ef85b7d6ff的StepValueEntity是瞬时的还是分离的;查询数据库。在会话中使用显式Save()或Update()可防止出现这种情况

因为nhibernate在开始真正插入东西之前会做很多更新

我做错了什么

我尝试过像迭代每个步骤和值,并明确地保存它,但同样的事情正在发生

编辑:

这就是我为标识列进行映射的方式,也许这并没有给nhibernate提供一个线索,让它知道哪些是新的和已经持久化的实体,我应该用另一种方式来做

Id(x => x.Id).Column("GUID_PIPELINE_STEP_PARAMETER").GeneratedBy.Assigned();

关于

也许您忘记了交易,请看:


为了记录在案,我向nhusers小组提出了同样的问题,一些人提出了如何关注这个话题的想法

最推荐的选项,也是我选择的,是不要使用自动生成的ID,而是在映射中使用一个生成器。这样NH就很容易知道从未插入过ID为空的实体


我选择Guid组合生成器,它创建一个唯一的Guid来解决分段索引问题

您是否在事务范围内执行此操作?您看到这个答案了吗@Sjonny我已经看到了这一点,但对我来说,在本例中它不适用,因为我告诉nhibernate我在映射中使用了分配的guid。我将把更多的细节映射到正文中。。。据我所知,我链接到的答案也谈到了分配的Id。我是否遗漏了什么?Hi@Sjonny,对我来说,就像在这种情况下,由于我的应用程序负责生成Guid,因此从来没有默认值告诉nhiberante这是一个未保存的实体。主对象在另一个事务中加载,但我总是使用事务。所以我想我会放弃这个原因。
using (var session = sessionFactory.OpenSesion())
using (var tx = session.BeginTransaction())
{
    // perform your insert here
    tx.Commit();
}