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

时间:2012-03-18 00:55:07

标签: nhibernate session warnings profiler

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

每个实体都有一个步骤列表,每个步骤都有一个值列表。 (我在映射上使用反转)。实体和步骤也引用了db中已有的主值。所以有一种新旧物体的混合。

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

该问题依赖于该分析器警告

之类的消息

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

因为在开始真正插入内容之前,nhibernate会进行大量更新。

我做错了什么?

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

修改

这就是我为标识列进行映射的方法,也许这并不能让nhibernate知道什么是新的和已经存在的实体,我应该以另一种方式进行。

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

此致

2 个答案:

答案 0 :(得分:2)

也许你忘记了交易,看看: http://nhprof.com/Learn/Alerts/DoNotUseImplicitTransactions

using (var session = sessionFactory.OpenSesion())
using (var tx = session.BeginTransaction())
{
    // perform your insert here
    tx.Commit();
}

答案 1 :(得分:0)

为了记录,我向nhusers小组提出了同样的问题,并且有些人提出了关于如何专注于这个主题的想法。

http://groups.google.com/group/nhusers/browse_thread/thread/bcc962d861c7f111

最推荐的选项和我选择的选项一直是不使用自动生成的ID并在映射中使用一个生成器。这样,NH很容易知道从未插入过具有空白ID的实体。

我选择Guid梳子生成器,它创建一个唯一的GUID来解决碎片索引问题