Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 插入NHibernate对象而不获取对其所有子对象的引用_C#_Nhibernate - Fatal编程技术网

C# 插入NHibernate对象而不获取对其所有子对象的引用

C# 插入NHibernate对象而不获取对其所有子对象的引用,c#,nhibernate,C#,Nhibernate,让我们选取一个示例模型作为参考: public class Cat{ public long Id; public string Name; public IEnumerable<Cat> Friends; //ManyToMany } 只要sally在当前范围内,这就可以正常工作。但在web环境中,考虑到我在MVC中工作,我不一定要将所有持久化对象都保存在内存中。考虑一个页面,在那里我可以创建新的cat并从多选列表中选择子项 如果MVC控制器只返回猫的ID

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

public class Cat{
    public long Id;
    public string Name;
    public IEnumerable<Cat> Friends; //ManyToMany
}
只要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;
long[]id;
IEnumerable friends=来自存储库中的cat.Query(),其中Id在ids中选择cat//哪一个是选择查询
猫玛丽=新猫{Name=“玛丽”,朋友=朋友};
保存(玛丽)//运行良好;
现在我的问题是:假设在某个时间我知道一个已持久化对象集合的主键,我如何插入一个新对象,该对象引用了集合的对象,而无需查询数据库以获取它们全部

我知道NHibernate有缓存,所以经常查询
会话
中的已知ID并不会触发完整的查询,但我想知道更多关于NHibernate的功能


由于该问题是出于示例目的而提出的,如果我不关心反向关系,请不要介意。

因为您有ID,所以只需使用
session.Load
获取引用,而无需从db加载它们

只需将第二行更改为以下内容:

var friends = from id in ids select session.Load<Cat>(id);
var friends=从ids中的id选择会话。加载(id);

由于您拥有ID,因此只需使用
session.Load
即可获取引用,而无需从数据库中加载引用

只需将第二行更改为以下内容:

var friends = from id in ids select session.Load<Cat>(id);
var friends=从ids中的id选择会话。加载(id);