c# - NHibernate 聚合遍历 (C#)

标签 c# nhibernate domain-driven-design aggregate traversal

我的应用程序现在有一个非常简单的模型,我正试图找到遍历聚合的最佳方法。正如您在底部的模型图中看到的那样,我有一个帐户、一次旅行和参加旅行的人员列表。我希望能够查看一个帐户所属的所有行程,我想出了这样的办法:

    public List<Trip> GetAllTripsFor(int accountid)
    {
        var tripRepository = new TripRepository();
        var trips = tripRepository.FindAll();
        var userTrips = new List<Trip>();

        foreach (Trip trip in trips)
        {
            foreach (TripPeople person in trip.People)
            {
                // If this trip's person list contains this accountid
                // then add this trip to the userTrips list.
                if(person.Account.Id == accountid)
                    userTrips.Add(trip);
            }
        }

        return userTrips;
    }

对我来说,这似乎不是很有效,而且我没有正确考虑事情。你们中有人有更好的实现方法吗?也许我在想我的模型错了?谢谢

alt text

最佳答案

我并不惊讶这对你来说感觉不对,事实并非如此。事实上,这是错误的,它伤害了!但不仅仅是让你悲伤,我会解释为什么这是错误的所有原因@

首先,您在从数据库到内存的所有行程中加载,这实质上意味着您正在查询数据存储以获取不需要的全部数据,然后通过网络将其传递。如果您有几次旅行,这很好,但这根本无法扩展。

接下来,您将遍历每次旅行并将属性称为“trip.People”。然后这将再次访问数据库并为这些旅行中的每一次加载人们的所有数据。同样,如果您有多个与会者的多次旅行,这将要了您的命。现在,这是假设您在映射上没有过滤器,或者您已经明确要求 NHibernate 不要延迟加载您的 People 集合,但无论哪种方式,这都是您不想要的整个数据加载。

我的建议是查看有关使用 HQL 或 Linq-To-NHibernate 查询对象模型的 NHibernate 文档,您最终会得到如下所示的查询:

HQL(我的 HQL 很糟糕所以这可能是非常错误的):

var hql = @"from Trip as t join t.People as p with p.Account.Id = :accountId select t"

编辑:

其实我现在脑子有点迟钝了,不过我才发现你这里做事有点倒退。您实际追求的是一个人进行过的所有旅行,那么为什么您的帐户对象没有映射到 Trips 集合呢?您基本上应该以这样的目标为目标:

var trips = accountRepo.GetAccount(123).Trips;

编辑:

我又累了,所以这可能是无稽之谈,但我认为您正在寻找的映射将如下所示:

    <bag name="Trip"  cascade="all" table="TripToAccount" lazy="true">
        <key column="AccountId" />
        <many-to-many class="Trip">
            <column name="TripId" not-null="true"/>
        </many-to-many>
    </bag>

编辑:

该死的,我该 sleep 了。现在我看到您已经在人和他们的旅行之间建立了映射,那为什么不呢:

var query = "from TripPeople as tp Where tp.Account.Id = :accountId AND tp.IsActive = true select tp.Trip"

在我做更多愚蠢的事情之前,现在要停止回答了。

关于c# - NHibernate 聚合遍历 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/966490/

相关文章:

c# - 失败 - 下载由 Ionic.Zip.dll 制作的 zip 文件时出现网络错误

nhibernate - 从LINQtoSQL迁移到Nhibernate的论点?

hibernate - 如何使用 Hibernate/NHibernate 内连接派生表?

c# - 业务层设计

content-management-system - 领域驱动的内容管理?

c# - 从给定的 url 文件夹路径的 azure 存储中获取文件名

c# - 无法使用样式禁用 WPF 扩展器

c# - 使用 linq 对计数的不同唯一事件进行排序

c# - 为什么 Trim() 在这个表达式中失败?

php - 对模型/实体含义以及 CRUD 和业务逻辑分离感到困惑