使用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查询。我过去只是接受了这个限制,但它确实开始在性能方面咬我。
如果有人可以提供帮助,我真的很感激。
答案 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。