0

我有一个简单的对象:

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 时看到了这一点,然后我注意到它也发生在其他测试中。

这是正常的行为吗?

4

2 回答 2

1

如果您将主键编号策略设置为自动增量,这是正常的。如果您使用不同的策略,例如低-高或其他算法机制,则没有必要,因为 NHibernate 可以自己设置 ID。有一篇关于主键策略的博客文章,它可能不是所有可用的 ID 生成机制的最新信息,但涵盖了主要的。您可以在此处选择不同策略的一些性能和相关信息。如果记忆对我有用,在支持它们的数据库上使用序列生成器可能会更高效,因为 Nhibernate 可以(至少在理论上)在使用它们之前询问它们。

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

于 2013-11-08T21:13:23.763 回答
0

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

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

于 2013-11-08T21:10:29.547 回答