获取NHibernate中新添加实体的代理

获取NHibernate中新添加实体的代理,nhibernate,lazy-loading,Nhibernate,Lazy Loading,我正在进行早期研究,在一个使用定制的应用程序引擎实现的系统中用NHibernate替换EF 客户端创建一个实体,比如Person,从用户那里获取属性值并将其发送到服务器。在服务器中,我们使用context.CreateObject()获取个人的代理。 然后将属性值应用于代理,我们可以使用延迟加载来访问相关对象。例如,如果此人有一个属性MajorID和一个导航属性Major,我们将MajorID设置为5,如果表达式访问Major,则正确的Major将延迟加载到此字段。更新也会发生类似的过程 在NH

我正在进行早期研究,在一个使用定制的应用程序引擎实现的系统中用NHibernate替换EF

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

在NHibernate中,我没有
createObject()
方法,因此我拥有的对象没有代理,因此没有延迟加载。此外,在更新中,如果我更改了MajorID,然后访问Major,它仍然指向旧的、错误的Major

我是NHibernate的新手,我能让它在这个场景中表现得像EF吗


谢谢

我想你可以通过
会话实现你所使用的wat。获取
并传递你想要加载的人的ID。对于id部分,在处理关联时通常不应直接使用它。你为什么不试试这样的方法呢:

var p = session.Get<Person>(personId);
p.Major = session.Get<Majors>(mayorId);
session.Update(p);
var p=session.Get(personId);
p、 Major=会话。Get(mayorId);
更新(p);

在NHibernate中根本不需要
CreateObject

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.
var person=new person()//不需要代理;人是一个新的实体
person.Major=会话负载(majord)//创建主代理,无数据库调用
//……在别的地方
var majorId=person.Major.Id//获取Id不会导致加载,永远不会
var foo=person.Major.foo//如果尚未加载,这将导致延迟加载。

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

在插入场景中,仅创建人员。我需要运行几个查询来验证它,其中一些可能通过导航属性。是的,我知道这一点:在OO世界中,外键被导航替换。但是,在我们的体系结构中,外键属性起着主要作用,我需要进行重大更改以消除这一要求。好的,我已经考虑过在服务器中从外键属性设置导航属性(我完全需要fk属性,我在客户端的许多自动连接中使用过它)。我没有注意到的是,根据其ID设置major不会导致数据库命中。所以,我排除了这个解决方案,因为不必要的查询。。。感谢您指出了正确的方向。\n现在您也知道了我为什么不喜欢EF:因为它迫使您从关系的角度(外键与导航)思考,预先假设开发人员将如何解决问题是API设计中最常见的问题。其中一些假设是必要的,因为您需要决定放弃一些特性,以便更好地支持其他特性。但是,当您没有面临重要的权衡时,最好让开发人员来决定,否则,您就不必要地限制了系统可以执行的体系结构。我在客户端以一种非常好的方式使用外键,从而最大限度地减少了网络使用、ui延迟和复杂性。失去FKs,我就失去了我的架构!!有时,您可以将FKs+其属性类型视为可以向用户显示的内容的唯一定位器,而不是关系世界中的关系。