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

时间:2011-12-16 15:26:17

标签: c# nhibernate fluent-nhibernate

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

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

我遇到的问题是设置WorkOrder可以有多个CrewAssignments的最后一部分。我想要做的是确保WorkOrder.CrewAssignments属性仅返回CrewAssignments,其Crew与WorkOrder具有相同的Contractor。或者,不那么罗嗦,“在哪里WorkOrder.Contractor == CrewAssignment.Crew.Contractor”。

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

HasMany(x => x.CrewAssignments).KeyColumn("WorkOrderID").Where(x => x.Crew.Contractor == x.WorkOrder.Contractor);

甚至可以做这样的事情吗?还是我完全吠叫了错误的树?谷歌整个上午一直没有让我失望。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

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

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

HasMany(x => x.CrewAssignments).KeyColumn("WorkOrderID").ApplyFilter<MyFilter>().Cascade.AllDeleteOrphan(); 

然后您可以创建过滤器:

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

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

Sessions.EnableFilter("contractor").SetParameter("contractorId", 1254);

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