我有一个简单的对象:
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时看到了这一点,然后我注意到它也与其他测试一起发生。
这是正常行为吗?
答案 0 :(得分:1)
如果您将主键编号策略设置为自动增量,则这是正常的。如果您使用不同的策略,如低 - 高或其他算法机制,则没有必要,因为NHibernate可以设置ID本身。主键策略有一个blog post,在所有可用的Id生成机制上可能不是最新的,但主要包含了主要策略。有关您可以选择here的不同策略的一些性能和相关信息。如果内存为我服务,使用序列生成器可能在支持它们的数据库上更有效,因为Nhibernate在使用它们之前可以(至少在理论上)要求它们。
为了将您的Id属性映射为您所期望的工作,找出刚插入的Id非常重要。此外,为了映射依赖于该主键的任何关联,ORM需要知道根对象的主键,因此您可能会在任何插入的关联记录上看到一轮更新。 (这也是关联的一方应设置Inverse属性的原因。)
答案 1 :(得分:0)
如果模型映射中的关键字段定义Generators.Identity
生成器,则这是正常行为。
如果您检查刚刚保留的模型的ID
字段,它现在将包含实际的数据库值。