流利的NHibernate-带Where子句的HasOne

流利的NHibernate-带Where子句的HasOne,nhibernate,fluent-nhibernate,fluent-nhibernate-mapping,Nhibernate,Fluent Nhibernate,Fluent Nhibernate Mapping,使用Fluent NHibernate,我可以根据我的用户类映射一对多关系,方法是: HasMany(x => x.Membership) .KeyColumn("UserID") .Where("Deleted = 0"); public virtual Membership CurrentMembership { get { return Membership.Single(m => m.Current); } } 这就像预期的那样,它只抓取尚未删除的

使用Fluent NHibernate,我可以根据我的用户类映射一对多关系,方法是:

HasMany(x => x.Membership)
    .KeyColumn("UserID")
    .Where("Deleted = 0");
public virtual Membership CurrentMembership
    { get { return Membership.Single(m => m.Current); } }
这就像预期的那样,它只抓取尚未删除的成员记录。No say我有一个名为Latest的会员资格字段,我知道这将为每个用户返回一条记录,我想说:

HasOne(x => x.CurrentMembership)
    .Where("Current = 1");
但是没有Where方法。我知道我可以在代码中这样做:

HasMany(x => x.Membership)
    .KeyColumn("UserID")
    .Where("Deleted = 0");
public virtual Membership CurrentMembership
    { get { return Membership.Single(m => m.Current); } }
但是这不允许我对这个属性进行LINQ查询。在过去,我只是接受了这一限制,但就性能而言,它真的开始咬我了

如果有人能帮忙,我会非常感激的

HasOne(x => x.CurrentMembership)
    .Where("Current = 1");
如果一个实体与另一个实体有“HasOne”关系,那么它只能链接到一个对象,因此Where方法没有意义。如果您的代码不小心没有将旧成员身份更新为Current=0,那么它可能会链接到CurrentMembership的两个实例,您将非常糟糕

我认为您的数据库设计有问题。我能想到的实现这一点的最好方法是在用户表上有一个CurrentMembershipID,然后您可以使用HasOne直接链接到它。这减少了数据库的开销(您不必在成员资格表中存储当前列),而且它可以有效地完成您需要的任务。此外,它避免了具有多个成员资格的用户将当前设置为1

你确定你的意思是“有一个”而不是多对一(“参考”)吗


干杯,我想这是一条路。