NHibernate是否使用对象实习?
|
为什么此代码有效?
NHibernate是否使用对象实习?
如果不是,则以下方法可行,因为NHibernate重载等于运算符?
foreach (var c in s.Query<Country>())
{
Console.WriteLine(\"\\n{0}\", c.CountryName);
// code in question
foreach(var p in s.Query<Person>().Where(x => x.Country == c) )
Console.WriteLine(\"{0}\", p.PersonName);
}
没有找到相关结果
已邀请:
2 个回复
担每棱绰
告耸
NHibernate的Linq-to-db提供程序在比较对象时并不关心实体的其他字段(实际上,事物是在DB级别上进行比较,而不是对象),它仅比较id。因此,上述代码的Linq-to-db只是将内容转换为:WHERE CountryId = 1。 而如果我们热切地将对象提取到内存中,则可以更轻松地推断行为。这不会产生任何行,即使我们复制所有属性也是如此,因为cx指向不同的地址。因此,此Linq-to-memory不产生任何行:
这是另一个Linq-to-memory代码,这一次它生成行,因此我们可以得出结论NHibernate实习生对象。
除了上面的代码会产生行外,Country china与Person \'s Country共享同一存储位置的另一个证明是:Person.Country.Population也输出777。 所以我想我可以得出结论,NHibernate也使用对象实习(在实现方面,我认为NH有效地实现了事情,在决定使用内部对象时不需要比较所有属性,可以将ID用作一种机制, whatdya想?:-))