插入一个NHibernate对象,但没有获得它所有子对象的引用

本文关键字:对象 引用 一个 NHibernate 插入 | 更新日期: 2023-09-27 18:12:04

让我们选择一个示例模型作为参考:

public class Cat{
    public long Id;
    public string Name;
    public IEnumerable<Cat> Friends; //ManyToMany
}

请注意,这是我所能描述的最简单的模型。

目前,为了插入一个新的Cat和它的Friends,我必须首先获得它们的完整的持久化对象。例如. .

Cat sally = Repository.GetByName("Sally").First(); //The first cat named Sally
Cat mary = new Cat{ Name="Mary, Friends = new Cat[] {sally} };
Repository.Save(mary); //Which is Session.Save(mary);

只要sally在当前作用域中,就可以正常工作。但在web环境中,考虑到我在MVC中工作,我不必将所有持久化对象保存在内存中。设想这样一个页面,我可以在其中创建新的cat并从多选择列表中选择子元素…

如果MVC控制器只返回我的猫的id(这是我想要的),我不能做以下,否则我得到一个重复的条目异常

Cat mary = new Cat{ Name="Mary, Friends = new Cat[] {new Cat{ Id = 1}, new Cat{Id=2}... };
Repository.Save(mary); //Boom, because it tries to persist the new children with duplicate IDs

我必须

long[] ids;
IEnumerable<Cat> friends = from cat in Repository.Query() where Id in ids select cat; //Which does a SELECT query
Cat mary = new Cat{ Name="Mary", Friends = friends };
Repository.Save(mary); //Which runs fine;

现在我的问题是:给定在某一时刻,我知道主键的集合已经持久化的对象,我怎么能插入一个新的对象,有引用的集合的对象,而不查询DB得到他们所有?

我知道NHibernate有缓存,所以经常查询一个已知ID的Session不会触发一个完整的查询,但我想知道更多关于NHibernate的力量。

既然这个问题是为了举例的目的,如果我不关心反比关系,请不要介意。

插入一个NHibernate对象,但没有获得它所有子对象的引用

既然您已经有了id,那么您所需要做的就是使用session.Load来获取引用,而不需要从数据库加载它们。

把第二行改成如下:

var friends = from id in ids select session.Load<Cat>(id);