如何在 Fluent nHibernate 中对 HasMany 映射进行额外过滤?

ros*_*ead 1 c# nhibernate fluent-nhibernate

在我正在进行的一个项目中,我有四个实体(以及其他一些实体),WorkOrder、Crew、CrewAssignment 和 Contractor。他们的关系是这样的:

  • 一个工作订单有一个承包商,可以更改
  • 一个船员只有一个承包商
  • 一个 CrewAssignment 只有一个 Crew
  • 一个工作订单有许多 CrewAssignments

我遇到的问题是设置 WorkOrder 可以有多个 CrewAssignments 的最后一部分。我想要做的是确保 WorkOrder.CrewAssignments 属性只返回与工作订单具有相同承包商的 CrewAssignments。或者,不那么冗长,“WorkOrder.Contractor == CrewAssignment.Crew.Contractor”。

我唯一能想到的就是这个,但它抛出了一个关于 x 变量未定义的异常。

HasMany(x => x.CrewAssignments).KeyColumn("WorkOrderID").Where(x => x.Crew.Contractor == x.WorkOrder.Contractor);
Run Code Online (Sandbox Code Playgroud)

做这样的事情甚至可能吗?还是我完全在错误的树上吠叫?谷歌整个上午都在用这个让我失望。有任何想法吗?

Tom*_*uλa 5

我不知道它是否可以帮助你,但这是我的看法。

FluentNHibernate 中ApplyFilter,您可以在映射中设置一个名为的方法,以便过滤子集合:

HasMany(x => x.CrewAssignments).KeyColumn("WorkOrderID").ApplyFilter<MyFilter>().Cascade.AllDeleteOrphan(); 
Run Code Online (Sandbox Code Playgroud)

然后你可以创建你的过滤器:

public class MyFilter: FilterDefinition
{
    public MyFilter()
    {
        WithName("contractor").WithCondition("Crew.ContractorId== :contractorId").AddParameter("contractorId", NHibernate.NHibernateUtil.Int32);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的存储库的实现中,您调用过滤器:

Sessions.EnableFilter("contractor").SetParameter("contractorId", 1254);
Run Code Online (Sandbox Code Playgroud)

我不知道这是否是最好的解决方案,但我现在想到的唯一解决方案。