5

同僚とちょっとした口論をしていますが、答えが見つからないようですが、これは非常に基本的なことです。

Fluent Nhibernate エンティティで 1 対多の関係を確立します。

ロールとユーザーを例にとってみましょう。ロールは複数のユーザーに割り当てることができるので、エンティティの根性を次のようにしました。

public class User
{
    [Required]
    public virtual string FirstName { get; set; }
    public virtual Role Role { get; set; }
}

と役割

public class Role
{
    [Required]
    public virtual string Name { get; set; }
    public virtual IList<User> Users{ get; set; }

    public Role()
    {
        Users = new List<Users>();
    }
}

ご覧のとおり、ロール内のユーザーのコレクションを参照しています。つまり、各ロールには複数のユーザーがいるということです。ユーザー エンティティには、ユーザーが属するロールを識別するために必要なロール エンティティ参照があります。

私の意見では、これがリンクの正しい方法であり、同僚は、Roleユーザーへの参照があると循環参照が作成されると言っています。誰が正しいですか?

ネットで答えを探してみました。この質問は私が正しいことを教えてくれると思います: Fluent NHibernate Many to one mapping

しかし、ここでFuent Nhibernateサンプルプロジェクトを見ました https://github.com/jagregory/fluent-nhibernate/tree/master/src/Examples.FirstAutomappedProject/Entities、私がしようとしていることの例ではありません埋め込む。正しい方法を説明するドキュメントを見つけるのを手伝ってくれませんか? 私は正しいですか?ありがとうございました。

4

1 に答える 1

12

ここで提案していることは、nHibernate フレームワーク内で完全に可能で許容可能です。明らかに、マッピング ファイルではなくモデルをリストしましたが、Fluent nHibernate では、この方法で問題なくマッピングを構成できます。

実際にこの方法で関係をマッピングすることを選択するかどうかは、個人の好みと特定のシナリオに完全に依存します. 私はこの方法でモデルをマッピングしましたが、同様にマッピングしないことを選択しました。これは主に、場合によっては、オブジェクト グラフを過度に複雑にすることが意味をなさないためです。たとえば、データベース内の複数のテーブルで何度も参照されるルックアップ テーブル (Culture や Locale など) を例にとると、これをマッピングすると、親モデルのそれぞれに Culture プロパティがありますが、親オブジェクトのコレクションはありません。文化モデルでは、意味がありません。

また、永続化レイヤーを介してデータをロードすることも検討する必要があります。この種の関係を作成し、いつ、またはユーザー コレクションにデータが入力されるかを考慮する必要がある役割の単純なリストが必要な場合は、熱心なロードまたは遅延ロードを指定できますが、私の経験では、クエリで対応する Fetch コマンドで熱心な読み込みを指定すると、データベースへの呼び出しがより最適化される可能性があります。

基本的に私が言っているのは、マッピングを定義する方法を決定する際に絶対的な「正しい方法」はないということです.リッチオブジェクトモデルとクエリパフォーマンスのバランスをとる必要がありますが、必要に応じて特定の例は完全に受け入れられます.

あなたの質問を読み直しましたが、このように構成されたマッピングの例も求めているかどうかわかりません。いくつかの例が必要な場合はお知らせください。いくつかまとめます。

あなたが説明する関係を実現するには、次のマップクラスが必要です(私はあなたがそれらを持っていると思うので、 Id プロパティを追加しました):

役割の場合:

public class RoleMap : ClassMap<Role>
{
    public RoleMap()
    {
          Table(@"Roles");
          Id(x => x.Id).GeneratedBy.Assigned();
          Map(x => x.Name).Column("Name");
          HasMany<User>(x => x.Users)
            .Inverse()
            .KeyColumns.Add("RoleId", mapping => mapping.Name("RoleId"));
    }
}

ユーザー向け:

public class UserMap : ClassMap<User>
{
   public UserMap()
    {
          Table(@"Users");
          Id(x => x.Id).GeneratedBy.Assigned();
          Map(x => x.FirstName);
          Map(x => x.RoleId);    
          References(x => x.Role)
            .Class<Role>()
            .Columns("RoleId");
    }
}

私は「あなたの方法と彼らの方法」にこだわるつもりはありません.上記は完全に受け入れられ、コードでオブジェクトモデルを使用するときの要件によって異なります. または、ロール マップにユーザー コレクションが必要ない場合は、そのプロパティと関連する HasMany マッピング宣言を削除します。上記から注意すべきことの 1 つは、.Inverse() 仕様が Role と User の間の関係の管理を Users エンティティに委任していることです。これは基本的に、既存のユーザーを追加または編集し、RoleId を提供するプロセスとして理にかなっています。関係を築いていきます。

さらに具体的な質問がある場合は、これが多少役立つことを願っています

于 2013-05-21T20:48:46.457 に答える