2010-11-22 8 views
0

Ich habe einige Klassen und wollen, dass sie korrekt Datenbank abzubilden:fließend nhibernate Komponente one-to-many

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; } 
} 

I Karte sie fließend Zuordnungen wie die Verwendung von:

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); 
    } 
} 

Als ich Speichern Sie meine Entity. Ich habe Klasse A wie erwartet einer Tabelle und Klasse B einer anderen zugeordnet. Aber ich habe Null in Component_id Spalte. Können Sie mir sagen, was fehlt mir hier?

+0

Ok, ich habe habe mein Problem gelöst - ich kann die ID meiner "Eltern" -Klasse verwenden. Die Komponentenzuordnung wird also zu: c.HasMany (x => x.Elements) .Cascade.All(). Column ("Id"); – coding4beer

Antwort

1

Ich glaube, dass Komponenten in der gleichen Tabelle sein sollten, wie in Ayende's blog post klar angegeben, da sie nur dazu dienen, die Daten besser als ein Objektmodell darzustellen. Achten Sie darauf, seinen Blog zu lesen, es ist wahrscheinlich eine der besten nHibernate-Ressourcen da draußen.

+0

Danke für die Antwort. Ich habe schon seinen Blog in meinem Reader :). – coding4beer

1

Ok, ich habe mein Problem gelöst - ich kann die ID meiner "Eltern" -Klasse verwenden. So wird die Komponentenzuordnung:

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

So offensichtlich, wie ich es jetzt ansehe ... aber es dauerte eine Stunde. (. Dh ohne ComponentClass Wrapper nach der Frage)

+0

Dadurch erhalten Sie nur eine Eins-zu-Eins-Beziehung, da Sie die Komponente explizit über denselben ID-Wert dem übergeordneten Element zuordnen, dh "Parent.1 => Component.1, Parent.2 => Component.2' – ChrisAnnODell

+0

Außerdem verfügen Sie nicht mehr über ein Wertobjekt. Sie verfügen jetzt über eine Entität, die die Identität des übergeordneten Elements erbt. Wenn Sie entity.Id = 1 und entity.Id = 2 haben und beide ein Wertobjekt mit demselben Wert haben, ist jede Komponente per Definition austauschbar, aber nicht mehr - Sie haben nun Component.1 und Component .2. Es ist möglich, eine Komponentensammlung "korrekt" zuzuordnen, aber NHibernate erlaubt keine Freigabe von Komponenten, d. H. Keine Eins-zu-viele-Komponenten oder eine Komponente, die eine Sammlung enthält, wie Sie sie hier definiert haben. Siehe http://docs.jboss.org/hibernate/core/3.3/reference/en/html/components.html – Sisyphus

1

Wenn Sie einen Eins-zu-viele-Verein direkt zu einer Sammlung von Komponenten haben, dann können Sie diese Karte direkt:

HasMany(x => x.Elements) 
    .AsSet() 
    .Table("ElementTable") 
    .KeyColumn("KeyColumn") 
    .Cascade.All() 
    .Component(x => 
    { 
     x.Map(c => c.Id); 
     x.Map(c => c.Time); 
    }) 
    .LazyLoad(); 
Verwandte Themen