繁体   English   中英

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

[英]How do you do additional filtering on a HasMany mapping in 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);

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

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

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);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM