Fluido NHibernate uno-a-uno no tiene cascada all-delete-huérfano
cascade fluent (3)
Al final, solo necesitaba averiguar qué estaba mal y solucionarlo, independientemente del comportamiento fluido predeterminado. Con la ayuda de http://brunoreis.com/tech/fluent-nhibernate-hasone-how-implement-one-to-one-relationship/ Pude resolver este problema.
Necesitaba agregar .Cascade.All (). Sin embargo, lo que realmente necesitaba era un .ForeignKey () fuera de la relación HasOne en mi asignación para la clase LineItemAssembly.
Estoy en el proceso de actualizar los archivos * .hbm.xml existentes en ClassMaps con fluidez y he tropezado con un error en nuestros archivos de mapeo, y no sé cuál es el comportamiento predeterminado para mapear esto correctamente.
El archivo de mapeo tiene:
<one-to-one name="LineItemAssembly"
class="LineItemAssembly"
cascade="all-delete-orphan" />
Cuando utilizo Fluent, esperaría que esto se asignara a:
HasOne<LineItemAssembly>(x => x.LineItemAssembly)
.Cascade.AllDeleteOrphan();
Sin embargo, AllDeleteOrphan () no es una opción fuera de Cascade (y correctamente). Entiendo que es porque no es una opción y es porque es un error en el archivo de mapeo. ¿Cuál sería el mapeo equivalente utilizando Fluent para que mi asignación fluida tenga exactamente la misma funcionalidad que el archivo .hbm.xml? Pensaría que solo dejar Cascade fuera del mapeo Fluent sería el comportamiento predeterminado, pero no estoy seguro.
No puede tener un huérfano en una relación 1: 1, por definición, ambos registros deben existir. Las eliminaciones siempre estarán en cascada en un 1: 1. No sé por qué los mapas XML lo permitieron.
Esto ahora es compatible con NHibernate 4.1 - la relación de nave en cascada de uno a uno "all-delete-huérfano" ahora está soportado correctamente (el problema NH-1262 ha sido corregido en 4.1). Probé eso y puedo confirmar que está funcionando: una vez que configura la propiedad infantil uno a uno como nula, emite el comando sql delete para el niño.
Desafortunadamente, el nhibernate fluido no lo admite, ya que se actualizó por última vez en 2015. Sin embargo, puede construir nhibernate con fluidez desde el código fuente ( https://github.com/jagregory/fluent-nhibernate , Cómo construir un NHibernate fluido ? ; Luché con esto un poco - necesitas instalar ruby, rubygems, ejecutar InstallGems.bat, ejecutar manualmente "bundle install" (no se estaba ejecutando para mí por alguna razón), y construir la solución usando el comando "rake").
Entonces todo lo que tienes que hacer es mover el método AllDeleteOrphan
de la clase CollectionCascadeExpression
clase CascadeExpression
y compilarlo (también puedes construirlo usando visual studio 2010+ abriendo FluentNHibernate.sln, pero tienes que ejecutar el comando "rake" al menos una vez).
Construido a medida (por mí) FluentNHibernate.dll versión 2.0.3.1 con soporte HasOne AllDeleteOrphan se puede descargar desde aquí