NHibernate一直要求LAST_INSERT_ID?

时间:2013-11-08 21:08:47

标签: c# sql nhibernate

我有一个简单的对象:

class Entity {
    public virtual int Id { get; set; }
    public virtual string Text { get; set; }
}

如果我使用相同的事务插入10个实体,我会收到以下调用:

INSERT INTO ...
SELECT LAST_INSERT_ID()

INSERT INTO ...
SELECT LAST_INSERT_ID()

...

INSERT INTO ...
SELECT LAST_INSERT_ID()

我不再使用这些实体了,只是插入它们。

我在使用记录器查看编写一些复杂查询时生成的SQL时看到了这一点,然后我注意到它也与其他测试一起发生。

这是正常行为吗?

2 个答案:

答案 0 :(得分:1)

如果您将主键编号策略设置为自动增量,则这是正常的。如果您使用不同的策略,如低 - 高或其他算法机制,则没有必要,因为NHibernate可以设置ID本身。主键策略有一个blog post,在所有可用的Id生成机制上可能不是最新的,但主要包含了主要策略。有关您可以选择here的不同策略的一些性能和相关信息。如果内存为我服务,使用序列生成器可能在支持它们的数据库上更有效,因为Nhibernate在使用它们之前可以(至少在理论上)要求它们。

为了将您的Id属性映射为您所期望的工作,找出刚插入的Id非常重要。此外,为了映射依赖于该主键的任何关联,ORM需要知道根对象的主键,因此您可能会在任何插入的关联记录上看到一轮更新。 (这也是关联的一方应设置Inverse属性的原因。)

答案 1 :(得分:0)

如果模型映射中的关键字段定义Generators.Identity生成器,则这是正常行为。

如果您检查刚刚保留的模型的ID字段,它现在将包含实际的数据库值。