【问题标题】:NHibernate - load sql query to entityNHibernate - 将 sql 查询加载到实体
【发布时间】:2010-08-24 10:28:51
【问题描述】:

基本上,我需要为使用父对象数据的查询结果设置一个属性。

使用下面的域模型,我需要使用来自 EntityA 和 EntityB 的数据来设置 EntityB 的 C 属性。

另外,我需要将 EntityB 的 A 属性设置为作为其父级的 EntityA 的实际实例。

查询:

Set EntityB.C = (select * from EntityC where SomeProperty = EntityB.SomeProperty and AnotherProperty = EntityB.A.AnotherProperty);

SomeProperty 和 AnotherProperty 不仅仅是键。

class EntityA
{
    public IList<EntityB> B
    {
        get;
        set;
    }

}

class EntityB
{
    public EntityA A
    {
        get;
        set;
    }


    public EntityC C
    {
        get;
        set;
    }
}

class EntityC
{
    ...
}

我需要一种方法来为返回的每个实体执行代码(运行查询并分配给属性)。我使用拦截器的 onload 方法接近了,但我正在寻找另一种方法。也许使用结果转换器或投影?

【问题讨论】:

    标签: c# nhibernate


    【解决方案1】:

    首先,如果您正确使用 NHibernate,框架应该会自动为您完成属性和关联。如果不是,那么您没有正确设置它...

    至于在属性中进行查询...通常不建议这样做(将其抽象为实用程序类,或者至少是函数调用),但我确实记得在这里看到了一些方法.

    【讨论】:

    • 就像我说的,这不是一个正常的关联。我的应用程序的 99% 是通过 Fluent NHibernate 映射的。此外,它不是在属性中进行查询,而是根据父对象的数据将实体的属性分配给查询结果。
    • 公平地说,您的原始问题不包含您刚刚分享的信息,所以如果您可以编辑您的帖子,那将对每个人都有帮助。
    【解决方案2】:

    其实有两个问题。

    问题 1:如何让某个查询加载的属性?

    问问你自己是否真的需要在实体中。考虑使用 DTO(数据传输对象)来保存来自不同实体和查询的数据。

    如果您确定在实体中需要此属性,请查看 formulas 以获得单端属性,查看 filters 以获得集合。

    我无法提供更详细的信息,因为您的问题非常笼统,并且取决于实际问题。但是您应该从给定的链接开始找到解决方案。

    问题 2:如何让属性指向父级?

    非常简单:只需实现属性并映射子集合 (B) "inverse=true"。以始终指向正确父级的方式实现您的实体。

    为什么 NH 不为您这样做?因为 NH 的职责只是将您的实体持久化到数据库中。 NH 不会自行对数据进行任何更改。这是您的业务逻辑的责任。

    注意:您的应用程序也应该能够在没有 NH 的情况下运行,例如在单元测试中。所以关系应该在你的代码中管理。

    【讨论】:

    • 1.在我上面的示例中,EntityB 的属性 C 必须是一个实体。 2. 我了解 NH 不会为我这样做。在实现拦截器时,我已经非常接近所需的一切,但是在我进行查询时存在一些数据尚未加载的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多