0

多くの電子メールを持つことができるユーザーがいます。これは List コレクションを通じてマップされます (ユーザーの IEnumerable Emails によって公開されます)。ユーザーごとに、メールの 1 つがプライマリになります (メールの「Boolean IsPrimary」プロパティ)。

NHibernate がユーザーのすべての電子メールをロードせずに、ユーザーからプライマリ電子メールを取得するにはどうすればよいですか?

次の 2 つのエンティティがあり、それぞれに対応するテーブルがあります

public class User
{
   private readonly IList<Email> _emails;

   public virtual int Id { get; private set; }
   public virtual IEnumerable<Email> Emails { get { return _emails; } }
   // public virtual Email PrimaryEmail { get; set; } - Possible somehow ?
}
public class Email
{
   public virtual int Id { get; private set; }
   public virtual String Address { get; set; }
   public virtual Boolean IsPrimary { get; set; }
   public virtual User User { get; set; }
}

ユーザーの「Email PrimaryEmail」プロパティなどを、「IsPrimary=1」が何らかの形で設定されている電子メールにマップできますか? 多分Sqlフォーミュラを使用していますか?ビュー ? 一対一の関係?または別の方法ですか?

プライマリ電子メールを他の電子メールの 1 つに変更できるはずなので、それらをすべて 1 つのテーブルに保持し、IsPrimary プロパティを変更するだけです。

SQL 式を使用して、現在のプライマリ電子メールの IsPrimary プロパティを false に設定し、その後 PrimaryEmail プロパティを電子メールに設定すると、ユーザーの "PrimaryEmail" プロパティを最新の状態に保つことができますか? IsPrimary を true に設定し、新しいプライマリ電子メールにする必要がありますか? NHibernate は、Sql Formula によってロードされた「古い/現在の」プライマリ電子メールの変更を追跡しますか? SqlFormula を使用する場合の 1 レベル キャッシュと 2 レベル キャッシュはどうですか?

View を使用して機能するかどうかわかりませんか?次に、電子メールをコンポーネントのようにマッピングできると思いますか? View からロードされたときに Email データを更新するときに機能しますか?

より良い方法はありますか?

ユーザーと電子メールの間に双方向の関係があるため、多くの場合、もちろんプライマリ電子メールを照会し、電子メールの「ユーザー」プロパティを使用してユーザーを取得できます (逆の代わりに、ユーザーからユーザーへプライマリ電子メール)

誰かが助けてくれることを願っていますか?

4

2 に答える 2

1

初めに。なぜそこで IEnumerable を使用しているのですか? そのプロパティがアクセスされるたびにクエリを起動しますか? そして、なぜそれはパブリックセッターを持っているのですか?

私には、それを IList または ICollection にしたいようです。2 つのメソッドを追加するので、リストを作成する方が理にかなっています。

User.SetPrimary(int index)
User.GetPrimary()
User.ICollection Emails { get; protected set; }

Email.IsPrimary { get; protected set; }

最初は電子メールを反復して、1 つのアイテムのみがプライマリに設定されていることを確認し、2 つ目は、プライマリとしてマークされているアイテムが見つかるまで電子メールを反復します。

于 2010-04-09T07:31:38.770 に答える
1

一見すると、PrimaryEMail が常にコレクション内の EMail オブジェクトの 1 つを参照していることを確認したいと思います (これを行う 1 つの方法は、get/set を完全にオンザフライにすることです)。あなたが持っているような完全に公開された設計では、EMail やコレクションのイベント ハンドラーを使用して変更をフックする必要があります。新しいプライマリ電子メール オブジェクト (プライマリに昇格するコレクション内のもの) は、その親コレクションまたはユーザーを認識するため、現在のプライマリを見つけてセカンダリにすることができるはずです。

代わりに、IsPrimary をパブリック セットにしないか、まったく公開しないようにすることもできます (email.IsPrimary は email == user.PrimaryEMail に置き換えられます)。PrimaryEMail set メソッドは、既にコレクションにある EMail オブジェクトのみを受け入れる場合があります。

私はこれを手動の ORM クラスでのみ行ったことがあり、NHibernate でこのかなり一般的なシナリオを実行するための正規の方法を見つけることができませんでした。そこに1つあるに違いありません。

于 2010-04-09T03:05:21.470 に答える