one many classmapping nhibernate nhibernate-mapping

many - La asignación NHibernate no agrega la opción ON DELETE CASCADE a la referencia de clave externa



nhibernate sessionfactory connection string (3)

Aquí está mi mapeo NHibernate.

<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="HelloNHibernate" namespace="HelloNHibernate"> <class name="Showing" table="showing"> <id name="Id" column="showing_id"> <generator class="identity"/> </id> <many-to-one class="Theater" name="Theater" column="theater_id" foreign-key="fk_showing_theater_theater_id" cascade="delete" lazy="false" fetch="join"/> <many-to-one class="Movie" name="Movie" column="movie_id" foreign-key="fk_showing_movie_movie_id" cascade="delete" lazy="false" fetch="join" /> </class> </hibernate-mapping>

Aquí está el SQL (PostgreSQL) generado por la herramienta SchemaExport:

CREATE TABLE showing ( showing_id serial NOT NULL, theater_id integer, movie_id integer, CONSTRAINT showing_pkey PRIMARY KEY (showing_id), CONSTRAINT fk_showing_movie_movie_id FOREIGN KEY (movie_id) REFERENCES movie (movie_id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT fk_showing_theater_theater_id FOREIGN KEY (theater_id) REFERENCES theater (theater_id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION )

¿Qué estoy haciendo mal? ¡Gracias!


La configuración en cascada de NHibernate no genera claves foráneas en cascada. Controla las acciones que NHibnerate tomará cuando se vacíe una sesión.

Además, es muy inusual que los muchos lados de la relación se eliminen en cascada por un lado. Su asignación eliminaría una película y un teatro relacionados cuando se elimine una muestra.


NHibernate solo puede generar restricciones de on delete cascade en colecciones inversas.

Ejemplo para tu dominio:

<class name="Movie"> ... <bag name="Showings" inverse="true" cascade="all"> <key column="Foo" on-delete="cascade" /><!--Here''s the magic--> <one-to-many class="Showing" /> </bag> </class>


Para complementar la respuesta aceptada, he aquí cómo lo harías con Fluent NHibernate:

public class MovieMap : ClassMap<Movie> { public MovieMap() { ... HasMany(c => c.Showings) .Inverse() .KeyColumn("Foo") .Cascade.All() .ForeignKeyCascadeOnDelete() // here''s the magic .ForeignKeyConstraintName("FK_Movie_Showing"); // this is optional - name is autogenerated otherwise