2010-11-22 16 views
0

私はクラスのカップルを持っているし、データベースにそれらを正しくマッピングしたい:流暢NHibernateはコンポーネント一対多

public class AMap : ClassMap<A> 
{ 
    public A() { 
     Id(x => x.Id); 
     Component(x => x.Component, 
        c => c.HasMany(x => x.Elements).Inverse().Cascade.All()); 
    } 
} 

public class BMap : ClassMap<B> 
{ 
    public B() { 
     Id(x => x.Id); 
     Map(x => x.Time); 
    } 
} 

I:

public class A 
{ 
    public virtual Guid Id { get; private set; } 
    public virtual ComponentClass Component { get; set; } 
} 

public class ComponentClass 
{ 
    public virtual IList<B> Elements { get;set; } 
} 

public class B 
{ 
    public virtual Guid Id { get; private set; } 
    public virtual DateTime Time { get; set; } 
} 

は、私はそのような流暢なマッピングを使用してそれらをマップ私のエンティティを保存する、私はクラスAを別のテーブルに期待どおりに1つのテーブルにマッピングしている。 しかし、私はComponent_id列にnullを持っています。 私はここに何が欠けているのか教えてもらえますか?

+0

を[OK]を、私はしました私の問題を解決 - 私は私の "親"クラスのIDを使用することができます。したがって、コンポーネントのマッピングは次のようになります。c.HasMany(x => x.Elements).Cascade.All()。Column( "Id"); – coding4beer

答えて

1

私は、コンポーネントがオブジェクトモデルとしてより良く表現されるようにするためにのみ使用されるため、コンポーネントはAyende's blog postに明記されているように、同じテーブルにあると考えています。彼のブログを読んでください、それはおそらくそこの最高のnHibernateリソースの一つです。

+0

お返事ありがとうございます。私はすでに自分のブログを自分の読者に持っています:)。 – coding4beer

1

私は問題を解決しました。私は自分の「親」クラスのIDを使用できます。コンポーネントマッピングは次のようになります。

私はそれを今見ています...しかし、それは1時間かかりました。

+0

これは、同じId値、すなわち、Parent.1 => Component.1、Parent.2 => Component.2' – ChrisAnnODell

+0

を介して、そのコンポーネントをその親に明示的にマッピングするので、1対1の関係を与えます。また、値オブジェクトがなくなり、親の身元を継承するエンティティが作成されました。 entity.Id = 1、entity.Id = 2があり、どちらも同じ値を持つ値オブジェクトを持っている場合、各コンポーネントは定義によって互換性があるはずですが、もはや存在しません。コンポーネント1とコンポーネント.2。 Componentコレクションを "正しく"マッピングすることは可能ですが、NHibernateでは、ここで定義したようなコレクションを含むコンポーネントやone-to-manyコンポーネントを共有することはできません。 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/components.htmlを参照してください。 – Sisyphus

1

あなたは(質問ごとにComponentClassラッパーなしすなわち。)コンポーネントの集合への直接の1対多の関連を持っている場合、あなたはそれを直接マッピングすることができます。

HasMany(x => x.Elements) 
    .AsSet() 
    .Table("ElementTable") 
    .KeyColumn("KeyColumn") 
    .Cascade.All() 
    .Component(x => 
    { 
     x.Map(c => c.Id); 
     x.Map(c => c.Time); 
    }) 
    .LazyLoad(); 
関連する問題