Estoy seguro de que esto es una cuestión sencilla, pero considere lo siguiente: tengo una referencia entre la empresa y el sector de la siguiente manera:Fluido NHibernate - Cómo direccionar la columna de clave externa como una propiedad
public class Company {
public Guid ID { get; set; }
public Sector Sector { get; set; }
public Guid SectorID { get; set; }
}
public class Sector {
public Guid ID { get; set; }
public string Name { get; set; }
}
Ok. Lo que quiero es que el SectorID del objeto de la empresa se rellene después de que me vaya:
(new Company()).Sector = new Sector() { Name="asdf" }
y hacer un color.
La asignación que estoy utilizando amablemente crea una columna adicional en la base de datos denominada Id_Sector en la tabla Compañía, pero no está disponible como una propiedad en la Empresa. Quiero que se llene la propiedad del SectorID.
El mapeo Actualmente estoy usando en el CompanyMap es
References(c => c.Sector).Cascade.All();
¿Alguien tiene alguna idea?
Gracias por su respuesta. Lamentablemente si hago la segunda opción (ajuste el nombre de la columna de la columna para que sea la misma que la propiedad, o conjunto Map(x => x.SectorID, "Sector_Id")
entonces consigo el error:
System.IndexOutOfRangeException: índice inválido 7 para este SqlParameterCollection con Count = 7.
Es posible que tenga que hacer la primera opción, pero me preocupa que se active una consulta adicional cuando llame al SectorID, ya que saca al Sector del DB (a menos que esté ansioso de cargarse, que es un poco molesto).
Me sorprende que no haya una respuesta fácil a esto.
¡WOW! Si uso
public virtual Guid SectorID
{
get { return Sector.ID;
}
continuación nhibernate es lo suficientemente inteligente como para saber que la columna Sector_id en la consulta organización es en realidad lo mismo que Sector.ID y devuelve esto bajo las capuchas. No envía una consulta adicional, incluso si la carga es lenta. ¡Estoy impresionado!
Como seguimiento ... Parece que hibernación no está realmente escrito para ser capaz de asignar la columna de clave externa de los objetos. Aunque esto puede ser un poco molesto para los servidores web, tiene sentido ya que se trata de una preocupación de persistencia que no es realmente una preocupación objetiva. Estoy utilizando asp.net MVC y he escrito una carpeta de modelo personalizada que tomará una caja de entrada de contacto de nombre (en lugar de ContactID), nuevo un nuevo contacto con la ID de lo que está en la caja de tex, y luego aplicar esto a la propiedad del Modelo. Esto evita el problema con listas desplegables en interfaces web. Publicará el código si alguien está interesado.
te doy puntos para resolver el error que estaba recibiendo, pero esto parece completamente no intuitiva. Parece que NHibernate tiene un problema de diseño si no puede manejar un escenario tan común como tener tanto el ID de FK como la instancia de objeto asociada como propiedades. –