2010-12-02 20 views
5

Ich versuche, eine Sammlung basierend auf einem Fremdschlüssel zu filtern. Ich habe zwei Klassen, die mitNHibernate mit falschem Tabellenalias

public class GroupPriceOverrideMap:ClassMap<GroupPriceOverride> 
    { 
     public GroupPriceOverrideMap() 
     { 
      CompositeId() 
       .KeyReference(x => x.Service,"ServiceCode") 
       .KeyReference(x => x.CustomerAssetGroup, "GroupID"); 

      Map(x => x.Price); 

      Table("accGroupPriceOverride"); 
     } 
    } 

public class CustomerAssetGroupMap:ClassMap<CustomerAssetGroup> 
    { 
     public CustomerAssetGroupMap() 
     { 
      Id(x => x.GroupID).Unique(); 

      Map(x => x.Description); 

      References(x => x.Customer).Column("CustomerID"); 

      HasMany<GroupPriceOverride>(x => x.PriceOverrides).KeyColumn("GroupID"); 

      Table("accCustAssetGroup"); 
     } 
    } 

abgebildet werden Abfrage ich es

_session.Linq<GroupPriceOverride>.Where(x => x.CustomerAssetGroup.GroupID == groupID) 

Verwendung jedoch wird diese

SELECT this_.ServiceCode as ServiceC1_9_0_, this_.GroupID as GroupID9_0_, this_.Price as Price9_0_ FROM accGroupPriceOverride this_ WHERE customeras1_.GroupID = @p0 

dort zu erzeugen, wo Klausel eine Tabelle alias verweist, die nicht vorhanden ist (customeras1). Dies ist wahrscheinlich ein Alias ​​für die Kreuzung mit customerassetgroup, aber es ist nicht notwendig, diese Kreuzung durchzuführen. Ich bin mir sicher, dass es nur etwas in meiner Kartographie ist, das stimmt, aber ich kann es nicht finden. Ich habe verschiedene Spaltenumbenennungen ausprobiert, falls das Vorhandensein von GroupID in beiden Tabellen Probleme verursacht, aber das hat es nicht behoben. Irgendwelche Ideen?

bearbeiten Ich fand, dass, wenn ich

_session.Linq<CustomerAssetGroup>().Where(x => x.GroupID == groupID).FirstOrDefault().PriceOverrides; 

dann habe ich das richtige Ergebnis zu tun

abgefragt. Ich fand auch, dass, wenn ich ein GroupPriceOverride speicherte und dann für es mit HQL abgefragt wurde, es dann nicht gefunden würde, aber ich könnte noch die Entität finden, indem ich das Elternteil lud und seine Sammlung von Überschreibungen ansah.

_session.CreateQuery("FROM GroupPriceOverride i").List().Count;//returns 0 
_session.CreateQuery("FROM CustomerAssetGroupi").List().FirstOrDefault().PriceOverrides.Count;//returns 1 

Antwort

1

Sieht aus wie ein Fehler im alten LINQ-Anbieter. Könnten Sie einen Bug-Datei hier:

https://nhibernate.jira.com/secure/Dashboard.jspa

Sie könnten in der Lage sein, über um es zu bekommen:

_session.Linq<GroupPriceOverride>.Where(x => x.CustomerAssetGroup == group) 

und lassen NHibernate die ID herauszufinden. Wenn Sie die Gruppe noch nicht haben, können Sie dies tun:

var group = _session.Load<CustomerAssetGroup>(groupID); 
_session.Linq<GroupPriceOverride>.Where(x => x.CustomerAssetGroup == group) 

Die ISession.Load (id) wird nur über einen Proxy generieren, wird aber nicht tatsächlich traf die Datenbank, bis Sie eine Eigenschaft zugreifen (die Sie würden nicht sein, da Sie es nur verwenden, um die ID anzugeben).

+0

Danke, James, ich habe einen Unit Test erstellt zu demonstrieren und geöffnet Problem http://216.121.112.228/browse/NHLQ-83 – stimms

+0

BTW - Verwenden Sie NH2.1.2 oder NH3? Wenn Sie NH3 verwenden, versuchen Sie, ISession.Query (eigentlich eine Erweiterungsmethode) zu konvertieren. Ihr Fehler befindet sich in dem alten LINQ-Anbieter, der veraltet ist. Der neue LINQ-Provider ist ein grundlegender Umschreibvorgang. –

+0

2.1.2, ich bin mir sicher, dass es einen Grund gab, warum ich NH3 nicht verwendet habe, aber es könnte nur sein, dass Nupack kein flüssiges Nhibernat für NH3 (faul) hat. Ich werde versuchen, flüssig gegen NH3 aufzubauen und es stattdessen zu verwenden. – stimms