2010-12-30 7 views
2

Also, ich muss meine Klasse zu Datenbanktabelle zuordnen, aber manchmal brauche ich faul laden zu sein, manchmal aus zu sein.Fließende NHibernate Karte 2 identische Klassen zu einer Tabelle, erste-faul auf, zweite-faul aus

Beispiel: Ich habe Duplikate dieser beiden unten beschriebenen Klassen erstellt, und ich kartiere sie mit FNH, aber mit lazy loading on im Original und off im Duplikat.

http://i.stack.imgur.com/goG30.png

Grundsätzlich möchte ich in der Lage sein, ein Team von DB zu erhalten, die alle Listen mit Teamkollegen hat geholt, aber die Mitglieder sollten nicht alle Teams und alles andere haben, einfach nur Informationen über ein Teammitglied. Auch wenn ich ein TeamMember von der DB bekomme, möchte ich, dass alle seine Teams nur einfache Infos enthalten.

"http://i.stack.imgur.com/7OkyD.png" -> sie erlauben es neuen Benutzern nicht, Bilder oder Links zu posten.

Also, wenn ich nur diese beiden Klassen habe, dann wenn eine Lazy Loading auf irgendeiner Seite eingeschaltet ist, ist eine der zuvor erläuterten Situationen nicht erfüllt. Wenn faul auf beiden Seiten ist, bekomme ich eine ganze Reihe von Daten, die ich nicht brauche oder nicht brauche.

Zuerst hatten Original und Duplikat gleiche Namen und waren in verschiedenen Paketen, aber ich bekam eine Ausnahme, dass Zuordnung nicht eindeutig war. Wenn es dafür einen Weg gibt, wäre das ideal. Gibt es eine Möglichkeit, dies zu tun?

Ich konnte keine Antwort finden, also änderte ich den Namen des Duplikats in NameOfOriginal + Lite. wurde Mapping analysiert, aber wenn ich ein Team aus der Datenbank erhalten wollte, erhalte ich eine Ausnahme:

{ "ORA-00904: \" SUPERVIZ _ \ TEAMMEMBERLITE_ID \ "\ "": ungültige Kennung \ n"}

Also, anscheinend FNH liest einen Klassennamen und Anzeigen eine "_ID" und verwendet das als ID für meine doppelte Klasse und das verursacht das Problem. Ich versuchte mit .ParentKeyColumn ("") .ChildKeyColumn ("") aber kein Erfolg.

Ich hoffe, ich habe Sie nicht zu verwechseln viel :)

[DataContract] 
    public class Team 
    { 
      [DataMember] 
      public virtual int Team_id { get; private set; } 

      [DataMember] 
      public virtual String Name { get; set; } 

      [DataMember] 
      public virtual String Description { get; set; } 

      [DataMember] 
      public virtual TeamMember Deputy { get; set; } 

      [DataMember] 
      public virtual TeamMember Leader { get; set; } 

      [DataMember] 
      public virtual IList<TeamMember> TeamMembers { get; set; } 

      [DataMember] 
      public virtual IList<TeamMember> Supervizors { get; set; } 
    ... 
    } 


    [DataContract] 
    public class TeamMember 
    { 
      [DataMember] 
      public virtual int TeamMember_id { get; set; } 

      [DataMember] 
      public virtual String First_name { get; set; } 

      [DataMember] 
      public virtual String Last_name { get; set; } 

      [DataMember] 
      public virtual String Sid { get; set; } 

      [DataMember] 
      public virtual IList<Team> SupevisingTeams { get; set; } 

      [DataMember] 
      public virtual IList<Team> LeaderInTeams { get; set; } 

      [DataMember] 
      public virtual IList<Team> DeputyInTeams { get; set; } 

      [DataMember] 
      public virtual IList<Team> MemberInTeams { get; set; } 
    ... 
    } 
+0

Ist das nicht einfacher zu deaktivieren/aktivieren faul Laden als Mapping? – Paco

+0

Ich habe nie den Fall gesehen, wo Lazy = False tatsächlich benötigt wird. Warum erzählst du uns nicht über dein tatsächliches Problem, anstatt nach einem Hack für eine fehlerhafte Lösung zu fragen? (Ich will nicht hart klingen, es ist nur, dass ich * weiß * das ist eine schlechte Herangehensweise) –

+0

Die Sache ist, dass die in Post gezeigten Klassen nur ein Teil meines Datenbankmodells sind. Ich habe schon in jedem Mapping ein langsames Laden, aber dann warte ich ungefähr 20 Sekunden um nur eine Entity zu bekommen! Das Warten wird mit der DB-Größe fortgesetzt. Es ist, weil ich nicht nur die Entitäten bekomme, die ich brauche, sondern stattdessen einen ganzen Objektbaum. Manchmal brauche ich alles, aber manchmal nicht, ich brauche nur ein paar Daten.Vielleicht kann das, was ich will, nicht getan werden. Ich arbeite an etwas, das wahrscheinlich helfen wird. Wenn es so ist, hinterlasse ich einen Kommentar. – Vladica

Antwort

0

Sie mehrmals eine Klasse zuordnen können, wenn Sie die Zuordnung einer Entität Namen geben. Sie müssen dafür ClassMap anstelle von Auto Mapping verwenden.

Mit Fluent NHibernate:

public class Foo 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class FooMap1 : ClassMap<Foo> 
{ 
    public FooMap1() 
    { 
     Table("Foo"); 
     EntityName("Foo"); 
     Id(x => x.Id); 
     Map(x => x.Name); 
    } 
} 

public class FooMap2 : ClassMap<Foo> 
{ 
    public FooMap2() 
    { 
     Table("Foo"); 
     EntityName("Bar"); 
     Id(x => x.Id); 
     Map(x => x.Name); 
    } 
} 

Sie müssen den Entity-Namen angeben, wenn die Abfrage Aufbau zu nhibernate die korrekte Zuordnung verwenden zu machen: Abfrage

using (var session = _sessionFactory.GetCurrentSession()) 
{ 
    return session.CreateCriteria("Bar") 
     .Add(Restrictions.Eq("Name", "Andrew")) 
     .List<Foo>(); 
} 
Verwandte Themen