2011-01-17 3 views
2

Ein Venue kann einen oder mehrere Areas haben, und umgekehrt hat jeder Area genau einen Venue. Ich verwende Build 1.0.0.636 von Fluent NHibernate.Fluent NHibernate generiert zusätzlichen Join und erstellt doppelte Entitäten in bidirektionaler Beziehung

Als ich Fetch.Join() an die VenueMap hinzugefügt verzögertes Laden zu eliminieren, die SQL erzeugt ein zurück in die Umgebung Join-Tabelle umfasst, von sich selbst: (vereinfacht, natürlich)

SELECT * 
FROM Areas 
LEFT OUTER JOIN Venues on Areas.VenueId = Venues.Id 
LEFT OUTER JOIN Areas as Areas2 on Venues.Id = Areas2.VenueId 

Dies bewirkt, dass es um doppelte Zeilen zurückzugeben, sodass jeder Venue doppelte Bereiche in seiner Sammlung enthält. Ich habe versucht, die DistinctBy von MoreLinq zu verwenden, nachdem ich alle Areas bekommen habe, aber das lässt immer noch Bereiche mit doppelten Bereichen übrig - es entfernt nur doppelte Bereiche aus der Hauptsammlung. Es fühlt sich auch sehr dreckig an, da ich ungefähr dreimal so viele Daten zurückgebe und dann wegwerfe.

Wie oben erwähnt, ist meine Abfrage, alle Bereiche zu bekommen und alle Orte eifrig geladen zu haben.

Domain Einheiten:

class Venue 
{ 
int Id; 
IList Areas; 
} 
class Area 
{ 
int Id; 
Venue Venue; 
} 

Mappings:

public class VenueMap : ClassMap<Venue> 
    { 
     public VenueMap() 
     { 
     Table("Venues"); 
       HasMany(v => v.Areas) 
       .KeyColumn("VenueId") 
       .Inverse() 
       .Fetch.Join(); 
     } 

public class AreaMap : ClassMap<Area> 
    { 
     public AreaMap() 
     { 
      Table("Areas"); 
      Id(a => a.Id); 
      References(a => a.Venue).Column("VenueId").Not.Nullable(); 
     } 
    } 

Irgendwelche Ideen, wie ich meine Zuordnungen aus und entfernen Sie die doppelten Bereiche sortieren? Ich habe googeln schon sooo viel zu tun ...

Danke, Monty

Antwort

1

So .Not.LazyLoad() ist die Angabe statt Fetch.Join() in VenueMap auf die Bereiche HasMany nicht?

UPDATE Was könnte besser funktionieren, ist die Fetch.Join() in Ihrem Mapping loszuwerden und eine Criteria Abfrage wie so zu verwenden.

session.CreateCriteria<Area>() 
.CreateAlias("Venue", "venue", JoinType.LeftOuterJoin) 
.List<Area>() 
+0

es tut, in einem Ausmaß, - aber ich bin immer (und Caching) ~ 15.000 Areas und .Not.LazyLoad() gibt eine SQL-Abfrage für jeden von diesen, die einfach keine Option ist. Danke für die schnelle Antwort, Yads. – Monty

+0

möglicherweise, obwohl ich bin mir nicht sicher über die Kriterien-Syntax und muss die folgende unglaublich einfache Linq-Abfrage neu schreiben - wenn Sie helfen können? Session.Linq (). Wo (a => a.Venue.StatusId! = 2). Ich würde lieber bei Linq bleiben, aber wenn es den Trick einmal macht ... – Monty

+0

denke, ich habe es, aber es ist nicht korrekt - gibt die gleichen Duples, also ich denke, erstellt genau die gleiche SQL. Session .CreateCriteria () .CreateAlias ​​("Ort", "Ort", JoinType.LeftOuterJoin) .Add (Restrictions.Not (Restrictions.Eq ("venue.StatusId", 2))) .List (); – Monty

Verwandte Themen