2010-12-02 21 views
5

Estoy tratando de filtrar una colección basada en una clave externa. Tengo dos clases que se asignan conNHibernate utilizando alias de tabla incorrecta

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

que consultarlo utilizando

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

Sin embargo, esto está generando

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

allí donde cláusula hace referencia a un alias de la tabla que no existe (customeras1). Este es probablemente un alias para cruzar con customerassetgroup, pero no es necesario realizar esa cruz. Estoy seguro de que es algo malo en mi mapeo pero no puedo encontrarlo. He intentado cambiar el nombre de varias columnas en caso de que la presencia de GroupID en ambas tablas estuviera causando problemas, pero eso no lo solucionó. ¿Algunas ideas?

Editar He descubierto que si me preguntó haciendo

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

entonces me dieron el resultado correcto. También encontré que si guardaba un GroupPriceOverride y luego lo consultaba usando HQL, no se encontraba, pero aún podía encontrar la entidad cargando el elemento primario y observando su colección de sobrescrituras.

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

Respuesta

1

Parece un error en el proveedor de LINQ anterior. ¿Podría informar de un problema aquí:

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

Usted puede ser capaz de conseguir alrededor de él a través de:

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

y dejar que NHibernate averiguar el ID. Si usted no tiene el grupo ya, usted puede hacer esto:

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

El ISession.Load (id) sólo generará un proxy, pero en realidad no se llegará a la base de datos hasta que acceda a una propiedad (que no lo estarías ya que solo lo estás usando para especificar la ID).

+0

Gracias, James, he creado una prueba unitaria para demostrar y abrir la emisión http://216.121.112.228/browse/NHLQ-83 – stimms

+0

BTW - ¿Está utilizando NH2.1.2 o NH3? Si está utilizando NH3, intente convertir a ISession.Query (en realidad, un método de extensión). Su error está en el antiguo proveedor de LINQ, que ha quedado obsoleto. El nuevo proveedor LINQ es una re-escritura básica. –

+0

2.1.2, estoy seguro de que había una razón por la que no estaba usando NH3 pero podría ser que nupack no tuviera un nhibernate fluido para NH3 (flojo). Intentaré reconstruir con fluidez contra NH3 y usarlo en su lugar. – stimms

Cuestiones relacionadas