Estoy buscando una manera de agregar una asociación entre dos entidades y tener un ID configurable para la clave externa. He buscado en publicaciones anteriores, pero lo más cercano que puedo encontrar es una sugerencia para cargar la asociación, que no es lo que estoy esperando. Sé que esto se puede hacer en Entity Framework con el enlace .HasForeignKey, pero parece que no puedo encontrar una manera de hacerlo en Fluent NHibernate.Fluidez NHibernate - mapeo de una clave foránea como propiedad
tomar las entidades dos ejemplos:
public class Ticket
{
public virtual int Id { get; set; }
public virtual string Title { get; set; }
public virtual string ServiceId { get; set; }
public virtual Service Service { get; set; }
}
public class Service
{
public virtual string Id { get; set; }
}
Quiero ser capaz de crear una nueva instancia de entradas y asignar un servicioa él utilizando los siguientes medios (suponer que el servicio asociado ya existe en la tabla):
Ticket ticket = new Ticket() {
Title = "Problem with MS Word",
ServiceId = "Microsoft Word 2012"
};
lo que no quiero hacer es la siguiente:
Ticket ticket = new Ticket() {
Title = "Problem with MS Word",
Service = Session.Load<Service>("Microsoft Word 2012")
};
tengo razones válidas para esto, y como he dicho esto se puede hacer en el marco de la entidad, pero realmente estoy perplejo en cuanto a cómo lograr lo mismo en Fluido NHibernate. Mis asignaciones actualmente se ven así:
public class TicketMapping : ClassMap<Ticket>
{
public TicketMapping()
{
Id(m => m.Id);
Map(m => m.Title).Column("Title");
Map(m => m.ServiceId).Column("ServiceId");
HasOne(m => m.Service).ForeignKey("ServiceId");
Schema("dbo");
Table("Tickets");
}
}
public class ServiceMapping : ClassMap<Service>
{
public ServiceMapping()
{
Id(m => m.Id);
Schema("dbo");
Table("Services");
}
}
Cualquier ayuda siempre se agradeció!
Sólo una edición rápida para Jay - la razón por la que no quiero Session.load mi elemento es porque yo no quiero que mi capa de presentación (MVC 3) saber nada de NHibernate - Por lo tanto, Estoy usando un patrón de repositorio e inyectando un único repositorio en el controlador. Así, por ejemplo, voy a tener un TicketRepository que se adhiere a la siguiente contrato
public interface IRepository<T>
{
T GetById(object id);
void Create(T entity);
void Update(T entity);
void Delete(T entity);
}
yo no quiero tener que inyectar una ServiceRepository también sólo para obtener una referencia al servicio deel Ticket.
¿Puede explicar los motivos válidos para no querer utilizar 'Session.Load'? – Jay
@Jay, no estoy seguro de la razón de Terric ... pero a veces puede ser ridículo sobrecargar un objeto solo para poder hacer referencia a la clave que ya tiene antes de guardar, en mi humilde opinión. Teníamos un acuerdo de nivel de servicio estricto en un proyecto anterior en el que tuvimos que hacer el mismo trabajo en Entity Framework antes de que tuviera soporte de FK. –
@Jay he actualizado mi publicación con motivos. Además, Kevin hace un buen punto, no quiero la sobrecarga adicional de cargar otra entidad para esto asociado. –