Me temo que el suyo no funcionará. Por diseño y naturaleza del <join>
. Como se indica en la documentación:
La forma en que (sí quiero) resolver este problema es un poco diferente. Tengo un objeto Language
, la Opción tiene una colección de idiomas
public virtual IList<Language> Languages {get; set;}
El mapeo es, por ejemplo, <bag>
<bag name="Languages" batch-size="25"
cascade="all-delete-orphan" inverse="true" >
<key column="option_id" />
<one-to-many class="Language" />
<filter name="LanguagFilter" condition=":languageId = LanguageId" />
</bag>
El truco está en el filtro . Esta es una versión dinámica del dónde atributo de mapeo (18.1. NHibernate filtros)
<filter-def name="LanguageFilter" >
<filter-param name="languageId" type="Int32" />
</filter-def>
Luego, podemos activar el filtro, para todas las operaciones de la sesión actual. Solo una vez por solicitud (si es una aplicación web), dentro de algún AOP, donde conocemos la identificación del idioma:
var filter = session.EnableFilter("LanguageFilter");
filter.SetParameter("languageId", theCurrentLanguageIdFromUser);
Y finalmente, sabemos que la colección Languages contiene solo un registro y siempre podemos acceder a .First()
. No más resultados múltiples con más idiomas
Consulte también:https://stackoverflow.com/a/16625867/1679310 , https://stackoverflow.com/a/18479266/1679310