流利的NHibernate - HasOne与Where子句

时间:2011-08-24 13:28:13

标签: nhibernate fluent-nhibernate fluent-nhibernate-mapping

使用Fluent NHibernate我可以通过说:

来映射我的User类的一对多关系
HasMany(x => x.Membership)
    .KeyColumn("UserID")
    .Where("Deleted = 0");

这符合预期,它只会抓取尚未删除的成员资格记录。不,我说我有一个名为Latest的成员,我知道这将为每个用户返回一条记录,我希望能够说:

HasOne(x => x.CurrentMembership)
    .Where("Current = 1");

但是没有Where方法。我知道我可以在代码中说:

public virtual Membership CurrentMembership
    { get { return Membership.Single(m => m.Current); } }

但是这不允许我对这个属性进行LINQ查询。我过去只是接受了这个限制,但它确实开始在性能方面咬我。

如果有人可以提供帮助,我真的很感激。

2 个答案:

答案 0 :(得分:2)

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

http://jagregory.com/writings/i-think-you-mean-a-many-to-one-sir/

答案 1 :(得分:0)

HasOne(x => x.CurrentMembership)
    .Where("Current = 1");

如果一个实体与另一个实体之间存在“HasOne”关系,那么它只能连接一个东西,因此Where方法没有意义。如果您的代码意外地没有更新旧的成员资格以使Current = 0,那么将会有2个可以链接到的CurrentMembership实例,而且你会非常紧张。

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