3

ウェブサイトのトップメニュー構造のモデルを作成しています-

MenuObjectモデルがあります:

public class MenuObject
{
    public virtual int Id { get; set; }
    public virtual string Title { get; set; }
    public virtual List<MenuObject> Children { get; set; }
}

およびマッピング:

public mapMenu()
{
    Id(x => x.Id)
        .Not.Nullable();
    Map(x => x.Title)
        .Not.Nullable();
    HasMany<MenuObject>(x => x.Children)
         .AsList();
}

基本的に、「トップレベル」メニュー項目を作成してから、それにいくつかの子項目を追加できるようにしたいです。データベース用語では、親メニュー項目のIDを含むParentIdフィールドが必要です(存在する場合)。これはnullになる可能性があります。 )。

これをオブジェクトモデルでどのように定義するかについて頭を悩ませています。また、これを構成したら、子供を救うにはどうすればよいですか?それは次のようなものでしょうか

public void InsertChild(MenuObject parent, MenuObject child)
{
    parent.Children.add(child)
    session.SAve(parent)
    .....
}

または、子を独立して保存し、親に明示的にリンクする必要がありますか?

編集**** * _ _

ありがとう-だから今私は私のモデルに次のものを持っています:

        public virtual MenuObject Parent { get; set; }
        public virtual List<MenuObject> Children { get; set; }

そしてこれはマッピングで:

 HasMany(x => x.Children)
       .AsList()
       .Inverse()
       .Cascade.All()
       .KeyColumn("ParentId");

        References(x => x.Parent, "ParentId");

これで、次の方法で子を親itmsに追加できます。

oChild.Parent = oParent;
session.SaveOrUpdate(oParent);
session.Save(oChild);
transaction.Commit();

私は勝者だと思います!それが最善の方法ですか?THanks gdoron

4

1 に答える 1

3

または、子を独立して保存し、親に明示的にリンクする必要がありますか?

とにかく、それをその親に「リンク」する必要があります。例外を取得したくない場合は、マッピングで
指定しない場合にのみ、子を個別に保存する必要があります。Cascade.Save\All()

HasMany<MenuObject>(x => x.Children)
    .AsList().Inverse.Cascade.All(); // Inverse will increase performance.

Parent「子」を「親」に接続するには、プロパティを追加する必要があります。
マッピングは次のとおりです。

References(x => x.Parent);       

PSあなたは書く必要は
ありません、それはデフォルトです。Not.NullableId

于 2012-01-21T18:33:47.410 に答える