Estoy tratando de establecer una relación de la siguiente manera. Cada elemento principal tiene una o más Detalle artículos:Configuración de NHibernate para la relación uno a varios unidireccional
public class Detail {
public virtual Guid DetailId { get; set; }
public virtual string Name { get; set; }
}
public class Master {
public virtual Guid MasterId { get; set; }
public virtual string Name { get; set; }
public virtual IList<Detail> Details { get; set; }
}
y las asignaciones:
public class MasterMap : ClassMap<Master>
{
public MasterMap()
{
Id(x => x.MasterId);
Map(x => x.Name);
HasMany(x => x.Details).Not.KeyNullable.Cascade.All();
}
}
public class DetailMap : ClassMap<Detail>
{
public DetailMap()
{
Id(x => x.Id);
Map(x => x.Name);
}
}
El Maestro mesa base de datos es:
masterId uniqueidentifier NOT NULL
name nvarchar(max) NULL
y Detalle es:
DetailId uniqueidentifier NOT NULL
name nvarchar(max) NULL
MasterId uniqueidentifier NULL
foreign key (masterId) references [Master]
Realmente no me importa tener un enlace desde Detalle volver al Maestro - en otras palabras, objetos de información por sí mismas no son sólo interesante para mi capa de dominio. Se siempre acceder a través de su objeto maestro.
El uso de código como este:
Master mast = new Master
{
MasterId = new Guid(),
Name = "test",
Details = new List<Detail>
{
new Detail { .DetailId = new Guid(), .Name = "Test1" },
new Detail { .DetailId = new Guid(), .Name = "Test1" }
}
};
using (transaction == Session.BeginTransaction)
{
Session.Save(mast);
transaction.Commit();
}
Esto funciona muy bien, excepto por una limitación loca indica en this post: NHibernate hace un INSERT y pone Detail.MasterId como NULL en primer lugar, a continuación, no una actualización de la puso a el verdadero MasterId.
Realmente, no quiero entradas de detalles con NULL MasterIds, así que si configuro el campo MasterId en NOT NULL, el INSERT to Detail fallará, porque como he dicho, NHibernate intenta poner MasterId = NULL.
Creo que mi pregunta se reduce a esto:
¿Cómo puedo obtener el ejemplo de código anterior para trabajar con mi modelo de dominio existente (por ejemplo, sin añadir una propiedad Detail.Master), y el campo Detail.MasterId en la base de datos establecida en NOT NULL?
¿Hay alguna manera de hacer que Nhibernate simplemente ponga el MasterId correcto en el INSERT inicial, en lugar de ejecutar una ACTUALIZACIÓN luego? ¿Hay alguna razón en algún lugar para esta decisión de diseño? - Estoy luchando para ver por qué se haría de esta manera.
me leyó eso, sino que en realidad no explica nada (tampoco lo hace la discusión de las asociaciones bidireccionales referencia). ¿Hay una razón detrás de esta decisión? ¿Es una limitación de diseño de nhibernate? ¿Es un error? Como relativamente novato en nhibernate, y sin saber nada de los elementos internos, parece que esto debería ser posible. – gregmac
Honestamente, no sé. No está clasificado como un error por el equipo de NHibernate, es solo un efecto secundario de cómo NHibernate persiste a las entidades. No voy a pretender saber las razones, pero me imagino que tiene algo que ver con ser agnóstico de base de datos y generador de identidades. –
En realidad, si se establece inverse = "false" y no-null en la clave NH3 y superior, solo se realizarán dos inserciones insead de insert-insert-update – hazzik