many - NHibernate: asignación de una clave externa de cadena
nhibernate sessionfactory connection string (4)
La base de datos heredada que he heredado contiene las siguientes tablas:
Teams (
TeamId INT PRIMARY KEY,
Name VARCHAR(30)
)
Players (
PlayerId INT PRIMARY KEY,
Team VARCHAR(30)
)
La clave externa en la tabla de jugadores se refiere al nombre del equipo, en lugar de teamId.
Intenté hacer un mapa del equipo a los jugadores usando una bolsa:
<bag name="Players">
<key column="Team" foreign-key="Name" />
<one-to-many class="DataTransfer.Player, DataTransfer" />
</bag>
Pero obtengo SqlException: la conversión falló al convertir el valor varchar ''Arsenal'' a tipo de datos int
He podido usar una bolsa para mapear claves extranjeras de cadena en otras áreas, pero en esos casos la clave externa se refería a la clave primaria de la tabla padre.
Editar: estoy usando NHibernate 2.0.1
Creo que el atributo property-ref existe para resolver este problema.
<bag name="Players">
<key column="Team" property-ref="Team" />
<one-to-many class="Player" property-ref="Team" />
</bag>
Creo que necesitaría usar el atributo property-ref para definir el campo al que se asociará. El atributo de clave externa se usa para generar DDL para crear las relaciones (si usa esa característica).
Ahora no estoy 100% seguro de si esto funcionará, pero ¿has probado una relación de mapeo de muchos a uno?
Tal vez algo como esto:
<many-to-one name="Players" class="DataTransfer.Player, DataTransfer"
column="Name" property-ref="Team" />
Creo que debería funcionar, de acuerdo con el manual NHibernate property-ref es un atributo que se utiliza para mapear datos heredados donde una clave externa se refiere a una clave única de la tabla asociada que no sea la clave principal. Esto suena como la situación en la que te encuentras.
Acabo de encontrar esto: https://nhibernate.jira.com/browse/NH-1272 , parece que este es un error en NHibernate, y está corregido en 2.1.0Alpha1.
Lo probé en NHibernate 2.1.0Alpha2, ¡y funciona!
(property-ref solo debe estar en la etiqueta del mapa)