C# NHibernate在每次插入之前执行选择

C# NHibernate在每次插入之前执行选择,c#,sql,nhibernate,C#,Sql,Nhibernate,我有一个只有一个字段(值)和以下映射的实体: Id(x => x.Value).Column("value").Length(150); 当我执行以下代码时 using (var tx = Database.BeginTransaction()) { for (int i = 0; i < 10; i++) { var e = new Entity { Id = "Value" + i }; Database.Entities.Add

我有一个只有一个字段(
)和以下映射的实体:

Id(x => x.Value).Column("value").Length(150);
当我执行以下代码时

using (var tx = Database.BeginTransaction())
{
    for (int i = 0; i < 10; i++)
    {
        var e = new Entity { Id = "Value" + i };
        Database.Entities.Add(e);
    }
    tx.Commit();
}
如果我启用批量模式(设置
adonet.batch\u size
),它将首先执行所有
SELECT
语句,然后在批量模式下执行
INSERT
语句


这就是我们想要的行为吗?如果是这样,我应该怎么做来避免这种情况?

这种行为是正确的,与以下事实有关:

  • ID being字符串->已分配了生成器类型(问题中的fluent映射行)
  • 虽然不鼓励,但使用了
    会话.SaveOrUpdate(e)
  • 见:,摘录:

    由于其固有的性质,使用此生成器的实体无法 通过ISession的SaveOrUpdate()方法保存。相反,你必须 如果要保存或删除对象,请显式指定为NHibernate 通过调用 伊塞翁

    在这种情况下,NHibernate几乎绝望了。为什么?因为无法确保分配的id('value1','value2'..)是否已在DB中。因此,为了确定是否应该发出INSERT或UPDATE,它必须询问DB。这就是为什么在做出决定之前选择


    仅使用
    Database.Entities.Add(e)
    后面的
    Save(e)
    ,不会发布支持基础设施选择

    创建Id为的实体将从数据库中获取该实体,因此不知道“数据库”是什么对象类型?非常感谢,Radim!这完全有道理:如果我调用
    SaveOrUpdate
    ,它首先需要知道实体是否存在!我尝试了
    Save
    ,效果非常好;)如果这有帮助的话,那就太好了。享受NHibernate。。。神奇的工具;)
    NHibernate: SELECT * FROM entity entity_ WHERE entity_.value=@p0; @p0 = 'Value0'
    NHibernate: INSERT INTO entity ...
    NHibernate: SELECT * FROM entity entity_ WHERE entity_.value=@p0; @p0 = 'Value1'
    NHibernate: INSERT INTO entity ...
    NHibernate: SELECT * FROM entity entity_ WHERE entity_.value=@p0; @p0 = 'Value2'
    NHibernate: INSERT INTO entity ...