nhibernate fluent-nhibernate nhibernate-mapping

Fluidez NHibernate: ¿Cómo crear mapeo bidireccional de uno a muchos?



fluent nhibernate mapping (1)

Para obtener una asociación bidireccional con una columna de clave externa no nula en la tabla Detalles, puede agregar la propiedad Propietario sugerida, una asignación de Referencias (...). CanNotBeNull () en la clase DetallesMapa y hacer que el Resumen sea inverso.

Para evitar tener dos columnas de clave externa diferentes para las dos direcciones de asociación, puede especificar los nombres de columna manualmente o nombrar las propiedades de manera que proporcione el mismo nombre de columna para ambas direcciones. En este caso, sugiero cambiar el nombre de la propiedad Details.Owner a Details.Summary.

Hice el ID de resumen generado por incremento para evitar problemas al insertar en la tabla, ya que Summary actualy no tiene columnas además de id.

Dominio:

public class Detail { public int id { get; protected set; } public string ItemName { get; set; } // Renamed to use same column name as specified in the mapping of Summary.Details public Summary Summary {get; set;} } public class Summary { public Summary() { Details = new List<Detail>(); } public int id { get; protected set; } public IList<Detail> Details { get; protected set; } }

Cartografía:

public class DetailMap : ClassMap<Detail> { public DetailMap() { Id(x => x.id) .GeneratedBy.Native(); Map(x => x.ItemName) .CanNotBeNull(); References<Summary>(x => x.Summary) // If you don''t want to rename the property in Summary, // you can do this instead: // .TheColumnNameIs("Summary_id") .CanNotBeNull(); } } public class SummaryMap : ClassMap<Summary> { public SummaryMap() { Id(x => x.id) .GeneratedBy.Increment(); HasMany<Detail>(x => x.Details) .IsInverse() .AsBag(); // Use bag instead of list to avoid index updating issues } }

Pregunta básica : ¿Cómo puedo crear un mapa bidireccional de uno a muchos en Fluirte NHibernate?

Detalles:

Tengo un objeto principal con muchos hijos. En mi caso, no tiene sentido que el niño no tenga un padre, por lo tanto, en la base de datos, me gustaría que la clave externa del padre tenga una restricción NOT NULL. Estoy generando automáticamente mi base de datos del mapeo de NHibernate fluido.

Tengo un padre con muchos objetos secundarios como ese:

public class Summary { public int id {get; protected set;} public IList<Detail> Details {get; protected set;} } public class Detail { public int id {get; protected set;} public string ItemName {get; set;} /* public Summary Owner {get; protected set;} */ //I think this might be needed for bidirectional mapping? }

Aquí está el mapeo con el que comencé:

public class SummaryMap : ClassMap<Summary> { public SummaryMap() { Id(x => x.ID); HasMany<Detail>(x => x.Details); } } public class DetailMap : ClassMap<Detail> { public DetailMap() { Id(x => x.ID); Map(x => x.ItemName).CanNotBeNull(); } }

En la tabla de Detalles, Summary_id debe ser Not Null, porque en mi caso no tiene sentido tener un objeto Detail no asociado al objeto de resumen. Sin embargo, el uso del mapa HasMany () deja la clave externa Summary_id nullable.

Encontré en los documentos de NHibernate ( http://www.hibernate.org/hib_docs/nhibernate/html/collections.html ) que "si se requiere el padre, use una asociación bidireccional de uno a muchos".

Entonces, ¿cómo creo el mapa bidireccional de uno a muchos en Fluent NHibernate?