2010-12-17 14 views
6

Aquí está mi asignación de NHibernate.Mapeo de NHibernate sin agregar la opción ON DELETE CASCADE a la referencia de clave externa

<?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!

Respuesta

8

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

Ejemplo de su 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> 
1

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 con la cascada eliminen por un lado. Su asignación eliminaría una película y un teatro relacionados cuando se elimine una muestra.

5

como complemento a la respuesta aceptada, así es como usted lo haría con Fluido 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 
+1

estoy actualmente de búsqueda para averiguar por qué mi cascada Eliminar no está funcionando. Cada vez que encuentro una respuesta, hay una línea más de código necesaria ;-) – PandaWood

Cuestiones relacionadas