Pregunta

He leído algunos post sobre fetch = unirse a - http://nhforge.org/blogs/nhibernate/archive/2009/04/09/nhibernate-mapping-lt-many-to-one-gt.aspx (ser4ik.livejournal.com/2505.html) Así que tengo algunas dudas, Porejemplo tengo clase

<class name="AttributesInf" table="attr_inf">      
 <id name="Id">
   <generator class="identity"/>
 </id>
 <property name="Name" />
    <property name="Desc"/>
</class> 

y

<class name="AttributeValue" table="attr_val">      
 <id name="Id">
   <generator class="identity"/>
 </id>
 <property name="Value" />
 <many-to-one name="AttrName" column="attrId"/>
</class> 

Si utilizo este mapeo sin equipo de fetch = "unir" Me SQL:

Select av.Id, av.Value, av.attrId From attr_val av where av.Id=...()

y después de consultas SQL a continuación, separadas como:

Select * From attr_inf where Id = av.attrId

Así que mi resultado es:

class AttrinuteInf 
{ 
int Id; 
string Name; 
string Desc; 
} 
class AttributeValue 
{ 
int Id; 
string  Value; 
AttributeInf AttrName;
}

Si fijo fetch = "Join" entonces consigo una consulta:

Select u.Id, u.UserName, u.BlogId, b.Id, b.BlogName, b.BlogAuthor, b.BlogMsg 
from Users u
Left outer join Blogs b 
On u.BlogId=b.Id
Where u.Id = ...

Así que espero conseguir uno Clase:

class AttributeValue
{
int Id;
string  Value;
string Name;
string Desc;
}

Pero tengo el mismo resultado que si no me puse traiga a "unirse".

Es todo esto cierto? ¿Hay alguna manera de obtener las propiedades de la clase maped como <many-to-one> directamente? (No como AttrName.Name, sino simplemente Nombre)

Explicación:

Parte de la asignación fija por encima no mostrar mi verdadero problema. Quiero trazar alguna entidad como IDictionary<string,AttributeValue>. Me MAP como

<map name="Attributes" table="attr_val" lazy="true" cascade="all-delete-orphan" inverse="true">
<key column="item_id"></key>
<index column="name"></index> //I don't have that item in class AttributeValue, that is why I try to get it from other table
<one-to-many class="AttributeValue"/>
</map>
¿Fue útil?

Solución

Esto no es hacer lo que piensa que está haciendo. El uso de fetch = JOIN es allí sólo para la carga ansiosa el lado muchos de la relación. En ambos casos se termina con la devolución de los mismos objetos. Por defecto NHibernate se carga perezosa las entidades relacionadas (razón por la que recibe la segunda consulta). Mediante el uso de fetch = unan está solicitando toda la relación de objeto a la vez, pero todavía se rellenará los objetos lo mismo que sin el fetch = unirse.

Otros consejos

No es la forma en que lo describes. Sus entidades no cambian dependiendo de lo que solicite.

Usted obtendrá una lista de instancias de su entidad principal, con la asociación para el otro es descabellada. Así que si, en su código, se accede a la asociación, se encuentran los valores.

Si no lo trae, que no sería capaz de acceder a esos campos, ya que no se han recuperado de la base de datos.

No entiendo su pregunta. El atributo 'ir a unirse a' sólo define cómo el SQL que NHibernate genera para recuperar las instancias de sus clases, debe ser similar. No tiene nada que ver con 'qué' será devuelto. NHibernate se traducirá el conjunto de registros (esto es el resultado de la consulta) para corregir las instancias de sus clases.

Si lo que desea es recuperar partes de su entidad (como el nombre, por ejemplo), entonces usted tendrá que escribir una consulta HQL, o utilizar la API ICriteria y tal vez usar proyecciones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top