【问题标题】:Obtain proxy for a newly added entity in NHibernate获取 NHibernate 中新添加实体的代理
【发布时间】:2012-08-08 04:07:40
【问题描述】:

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

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

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

我是 NHibernate 的新手,我可以让它在这种情况下表现得像 EF 吗?

谢谢

【问题讨论】:

    标签: nhibernate lazy-loading


    【解决方案1】:

    在 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.
    

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

    【讨论】:

    • 好吧,我已经考虑过在服务器中从外键属性设置导航属性(我完全需要 fk 属性,我已经在许多自动连接中使用它客户端)。我没有注意到从 ID 设置专业不会导致数据库命中的事实。因此,由于不必要的查询,我排除了此解决方案...感谢您指出正确的方向。\
    • 现在你也知道我为什么不喜欢 EF 了:因为它迫使你以关系的方式思考(外键与导航)
    • 对开发人员将如何解决问题做出假设是 API 设计中最常见的问题。其中一些假设是必不可少的,因为您需要决定放弃一些功能,以便出色地支持其他功能。但是,当您没有面临重要的权衡时,最好让开发人员来决定,否则,您将不必要地限制系统可以执行的架构。我在客户端以极好的方式使用外键,最大限度地减少网络使用、用户界面延迟和复杂性。失去 FK,我失去了我的架构!!
    • 有时您可以将 FK 及其属性类型视为您可以向用户展示的唯一定位器,而不是关系世界中的关系。
    【解决方案2】:

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

    var p = session.Get<Person>(personId);
    p.Major = session.Get<Majors>(mayorId);
    session.Update(p);
    

    【讨论】:

    • 在插入场景中,Person 刚刚被创建。我需要运行几个查询来验证它,其中一些可能会通过导航属性。
    • 是的,我知道重点:在面向对象的世界中,外键被导航所取代。但是,在我们的架构中,外键属性起着重要作用,我需要进行重大更改以消除此要求。
    猜你喜欢
    • 2015-09-17
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多