插入一个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的力量。
既然这个问题是为了举例的目的,如果我不关心反比关系,请不要介意。
既然您已经有了id,那么您所需要做的就是使用session.Load
来获取引用,而不需要从数据库加载它们。
把第二行改成如下:
var friends = from id in ids select session.Load<Cat>(id);