1

Fluent NHibernate を使用すると、次のように User クラスに対して 1 対多の関係をマップできます。

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

これは、削除されていないメンバーシップ レコードのみを取得するため、期待どおりに機能します。いいえ、これがユーザーごとに 1 つのレコードを返すことがわかっているメンバーシップに対して、Latest というフィールドがあるとは言いません。

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

ただし、Where メソッドはありません。私は次のように言ってコードでこれを行うことができることを知っています:

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

しかし、これでは、このプロパティに対して LINQ クエリを実行できません。以前はこれを制限として受け入れていましたが、パフォーマンスの面で本当に苦しめられ始めています。

誰かが助けてくれたら本当にありがたいです。

4

2 に答える 2

2

多対一 (「リファレンス」) ではなく、「HasOne」を意味していますか?

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」の関係にある場合、リンクできるものは1つしかないため、Whereメソッドは意味がありません。コードが誤って古いメンバーシップをCurrent=0に更新しない場合、リンクできるCurrentMembershipのインスタンスが2つあり、かなり困惑します。

データベースの設計に問題があると思います。これを実装することを考えることができる最善の方法は、UserテーブルにCurrentMembershipIDを設定してから、HasOneを使用してそれに直接リンクできるようにすることです。これにより、データベースのオーバーヘッドが少なくなり(メンバーシップテーブルに現在の列を保存する必要がありません)、探していることを効果的に実行できます。また、現在が1に設定されている複数のメンバーシップを持つユーザーを回避します。

于 2011-08-24T13:53:14.263 に答える