4

私は非常に単純なオブジェクト モデルを持っています。

public class Contact
{
    public virtual int Id                { get; set; }
    public virtual string Name           { get; set; }
    public virtual Device Device         { get; set; }
    public virtual IList<string> Numbers { get; set; }

    public Contact()
    {
        Numbers = new System.Collections.Generic.List<string>(3);
    }
}

ご覧のとおり、クラス Contact は、文字列のリストである Numbers と関連付けられています。

マッピングは次のとおりです。

        Id(x => x.Id).GeneratedBy.Assigned();
        Map(x => x.Name);
        References(x => x.Device, "DeviceId");
        Table("Contacts");
        HasMany(x => x.Numbers)
            .Table("ContactNumbers")
            .Element("Number")
            .KeyColumn("ContactId")
            .LazyLoad()
            .Cascade.All()
            .Not
            .Inverse();

コレクションは単なる文字列のコレクションであるため、コレクションを inverse=true にすることはできませんし、したくないことに注意してください。これは、Contact が Numbers エントリの更新を担当することを意味します。ここでの問題は、既存の連絡先に新しい番号を追加しようとすると、関連付けられているすべての番号が削除され、個別に再作成されることです。NHibernate は、変更を検出して変更された項目のみを更新するほどスマートではありませんか?

私の問題には簡単な解決策があるはずですが、何がわかりません。

どんな助けでも大歓迎です。

4

1 に答える 1

7

これは、NHibernate のドキュメント実際に記載されています。

バッグは最悪のケースです。バッグは要素値の重複を許可し、インデックス列を持たないため、主キーを定義できません。Hibernate には、重複する行を区別する方法がありません。NHibernate は、コレクションが変更されるたびにコレクションを完全に削除して (1 回の DELETE で) 再作成することにより、この問題を解決します。これは非常に非効率的かもしれません。

代わりにマッピングを使用してみて、<idbag>そのテーブルの代理主キーを作成してください。残念ながら、FluentNHibernateではまだサポートされていないよう<idbag>です。

また、他のコレクション マッピング オプションもご覧ください。

于 2012-07-10T15:10:42.853 に答える