开发者

Why does NHibernate need to know the ID of an auto ID based entity before flush is called?

开发者 https://www.devze.com 2023-02-15 08:06 出处:网络
With my only ORM knowledge being L2S/EF, I was surprised when the following code inserted a row into the database before I called repo.Save:

With my only ORM knowledge being L2S/EF, I was surprised when the following code inserted a row into the database before I called repo.Save:

var repo = new UserRepository();
var user = new User { Name = "test" }

repo.Add(user);

//repo.Save();

Repo looks like this:

public void Add(T entity)
{
    session.Save(entity);
}

public void Save()
{
    session.Flush();
}

After some digging, it seems NHibernate needs to make the insert happen right away in order to get the ID of the new entity (since it's using an auto increment ID). But L2S/EF doesn't work like this; I can add many entities and save them all at the end.

Question is: is there a way to ach开发者_如何学Cieve the same thing with NHibernate, while still using auto increment IDs, and out of interest does anyone know why it works like this?


Fabio Maulo already blogged about the usage of identity generator a few times. The answer is: use hilo, guid.comb or something like this.

NHibernate needs the identity because every entity in the session (they are called "persistent entities") needs to be identified. The identity is also normally used to determine if the record already exists in the database (unsaved value).

session.Save actually only makes a transient entity persistent. When the database is generating the id, it needs to be stored to get the id. If NH can create the id itself (eg using hilo), it could be stored next time when the session gets flushed.

0

精彩评论

暂无评论...
验证码 换一张
取 消