2010-12-17 9 views
6

Oto moje mapowanie NHibernate.Mapowanie NHibernate bez dodawania opcji ON CASE DELETE do klucza obcego

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

Oto SQL (PostgreSQL) generowane przez narzędzie 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 
) 

Co robię źle? Dzięki!

Odpowiedz

8

NHibernate może generować tylko ograniczenia on delete cascade w kolekcjach odwrotnych.

Przykład dla domeny:

<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

Ustawienie kaskady NHibernate nie generuje kaskadowych kluczy obcych. Kontroluje działania, które NHibnerate podejmie po przepłukaniu sesji.

Ponadto, bardzo niezwykłe jest to, że po wielu stronach związku kaskadowo usuwa się z jednej strony. Twoje mapowanie spowoduje usunięcie powiązanego filmu i teatru po usunięciu Pokazu.

5

Aby uzupełnić zaakceptowane odpowiedź, oto jak chcesz to zrobić z 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 
+1

Jestem obecnie szuka się dowiedzieć, dlaczego mój kaskadę delete nie działa. Za każdym razem, gdy znajdę odpowiedź, potrzebny jest jeszcze jeden wiersz kodu ;-) – PandaWood

Powiązane problemy