1

使用 Fluent NHibernate,我可以通过以下方式将一对多关系映射到我的 User 类:

HasMany(x => x.Membership)
    .KeyColumn("UserID")
    .Where("Deleted = 0");

这按预期工作,它只获取尚未删除的成员资格记录。不说我有一个名为针对会员资格的最新字段,我知道这会为每个用户返回一条记录,我想说:

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

但是没有 Where 方法。我知道我可以通过以下代码在代码中做到这一点:

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

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

如果有人可以提供帮助,我将不胜感激。

4

2 回答 2

2

Are you sure you mean "HasOne" and not a many-to-one ("References")?

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

于 2011-08-25T09:15:50.933 回答
0
HasOne(x => x.CurrentMembership)
    .Where("Current = 1");

如果一个实体与另一个实体具有“HasOne”关系,那么它只能链接到一个事物,因此 Where 方法没有意义。如果您的代码意外地没有将旧成员更新为 Current=0,那么将有 2 个 CurrentMembership 实例可以链接到,您会被搞砸的。

我认为您的数据库设计有问题。我能想到的实现这一点的最佳方法是在您的用户表上有一个 CurrentMembershipID,然后您可以使用 HasOne 直接链接到它。这对您的数据库来说开销较小(您不必在成员资格表上存储 Current 列),并且它将有效地完成您正在寻找的事情。此外,它避免了具有多个成员资格的用户将当前设置为 1。

于 2011-08-24T13:53:14.263 回答