2010-09-03 3 views
7

Ich habe eine untergeordnete Tabelle, die eine ID zum übergeordneten enthält. Dies ist eine Eins-zu-Eins-Zuordnung, aber in der untergeordneten Tabelle fehlen möglicherweise Werte. Ich habe Probleme beim Zuordnen, ohne einen Fehler zu bekommen ... Ich habe mehrere Dinge ausprobiert; die gleiche Spalte abbildet, mit einzelnen Eigenschaften etc ..Verwenden einer Referenz als ID in fluentnhibernate

 
Parent table 
    int id 

Child table 
    int parentid 

Parent class 
    int id 

Child class 
    Parent parent // note I'm referencing parent, not using an int id.. 

Mapping

Id(x => x.Parent) 
    .Column("parentid"); // fails 

Id(x => x.Parent.Id) 
    .Column("parentid"); // fails 

References(x => x.Parent) 
    .Column("parentid"); // fails - missing id 

// Adding an id field in addition to parent for 
// child class (id is then the same as parent.id) 
// fails on save 
Id(x => x.Id) 
    .Column("parentid"); 
References(x => x.Parent) 
    .Column("parentid"); 

würde es das Kind Klasse nicht wie ein eindeutiges ID-Feld zu haben, sondern nur ein Verweis auf Eltern, da es kann niemals ein Kind ohne Eltern sein. In der Datenbank möchte ich jedoch nur die ID des Elternteils speichern.

Irgendwelche Ideen, wie ich das tun könnte?

Antwort

5

Die folgenden Werke:

Id(x => x.Parent.Id).Column("MemberID"); 
References(x => x.Parent).Column("MemberID").ReadOnly(); 

Die Readonly für das Referenz wichtig ist keine Ausnahme

EDIT zu bekommen: War das nicht so einfach ...

noch Mein Kind Klasse hatte Die ID-Eigenschaft wird aufgerufen. Scheint, dass die ID-Referenz für Parent.Id nhibernate verwirrt und stattdessen versucht, child.Id aufzurufen. Ich fügte Kind hinzu, und jetzt scheint es zu funktionieren .. Ein ziemlich hässlicher Hack obwohl.

public virtual int Id { 
    get { return Parent.Id; } 
    set { Debug.Assert(value == Parent.Id); } 
} 
+0

+1 hier für mich gearbeitet, aber es ist ein eleganter Weg, dies zu tun? –

0

FluentNHibernate API hat sich im Laufe der Jahre verändert, so bin ich nicht sicher, ob diese Syntax zur Verfügung stand, wenn diese Frage ursprünglich gefragt wurde, aber Sie können nun eine Referenz als ID verwenden, wenn Sie es als eine zusammengesetzte ID Karte. Ich würde dies nicht als Hack bezeichnen, aber es ist ein wenig seltsam, dass Sie den Verweis auf die übergeordnete Entität als Teil einer zusammengesetzten ID zuordnen müssen. Hier ist ein vollständiges Beispiel:

public class ParentMap : ClassMap<Parent> 
{ 
    public ParentMap() 
    { 
     Table("StackOverflowExamples.dbo.Parent"); 

     Id(x => x.ParentId); 
     Map(x => x.FirstName); 
     Map(x => x.LastName); 
    } 
} 

public class OnlyChildOfParentMap : ClassMap<OnlyChildOfParent> 
{ 
    public OnlyChildOfParentMap() 
    { 
     Table("StackOverflowExamples.dbo.OnlyChildOfParent"); 

     CompositeId().KeyReference(x => x.Parent, "ParentId"); 
     Map(x => x.SomeStuff); 
     Map(x => x.SomeOtherStuff); 
    } 
} 

public class Parent 
{ 
    public virtual int ParentId { get; set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
} 

public class OnlyChildOfParent 
{ 
    public virtual Parent Parent { get; set; } 
    public virtual string SomeStuff { get; set; } 
    public virtual string SomeOtherStuff { get; set; } 

    #region Overrides 

    public override bool Equals(object obj) 
    { 
     if (obj == null || GetType() != obj.GetType()) 
      return false; 

     var child = obj as OnlyChildOfParent; 

     if (child != null && child.Parent != null) 
     { 
      return child.Parent.ParentId == Parent.ParentId; 
     } 

     return false; 
    } 

    public override int GetHashCode() 
    { 
     return Parent.ParentId; 
    } 

    #endregion Overrides 
} 
0

Vielleicht this Beitrag kann helfen.
Ich habe die Annotation .Cascade.SaveUpdate() verwendet.
Mein Fall war mit einem hasOne in den Eltern die Anmerkung auf beiden Seiten setzen

Obs: Sprache PT-BR

+0

Es ist hilfreich, wenn Sie den relevanten Teil der verknüpften Antwort übersetzen könnten ... –