1

我正在进行早期研究,以在使用自定义编写的应用程序引擎实现的系统中用 NHibernate 替换 EF。

客户端创建一个实体,比如 Person,从用户那里获取属性值并将其发送到服务器。在服务器中,我们用来context.CreateObject<Person>()获取一个 Person 的代理。然后将属性值应用于代理,我们能够使用延迟加载来访问相关对象。例如,如果这个人有一个属性MajorID和一个导航属性Major,我们设置MajorID5,如果一个表达式访问Major,正确Major的被延迟加载到这个字段中。更新也会发生类似的过程。

在 NHibernate 中,我没有CreateOject<>()方法,所以我拥有的对象没有被代理,因此缺少延迟加载。此外,在更新中,如果我更改 MajorID 然后访问 Major,它仍然指向旧的错误的 Major。

我对 NHibernate 很陌生,在这种情况下我可以让它表现得像 EF 吗?

谢谢

4

2 回答 2

2

CreateObject在 NHibernate 中你根本不需要。

NH 中代理的实现与 EF 完全不同,它基于实体,而不是属性。

以下是这在 NH 中的工作方式:

var person = new Person(); //no proxy needed; person is a new entity
person.Major = session.Load<Major>(majorId); //creates Major proxy, no DB call
//...somewhere else
var majorId = person.Major.Id; //getting the Id does not cause loading, ever
var foo = person.Major.Foo; //this causes lazy-loading if not already loaded.

需要注意的一件有趣的事情是,没有MajorId属性,也不需要属性,因为与 EF 不同,您可以为已经持久化的实体创建代理。

于 2012-08-07T20:07:40.883 回答
1

我认为你可以实现你使用的 watsession.Get<>并传递你想要加载的人的 ID。对于 id 部分,当您操纵关联时,通常不应直接使用它。你为什么不试试类似的东西:

var p = session.Get<Person>(personId);
p.Major = session.Get<Majors>(mayorId);
session.Update(p);
于 2012-08-07T11:35:08.517 回答