2010-12-17 11 views
6

これは私のNHibernateマッピングです。外部キー参照にON DELETE CASCADEオプションを追加しない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> 

ここではSchemaExportツールによって生成されたSQL(PostgreSQLには)です:

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 
) 

私が間違って何をしているのですか?ありがとう!

答えて

8

NHibernateは逆コレクションの制約を生成するためにのみon delete cascadeを生成できます。

ドメインの例:受け入れ答えを補完する

<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

NHibernateのカスケード設定では、外部キーのカスケードは生成されません。セッションがフラッシュされたときにNHibnerateが実行するアクションを制御します。

また、関係の多くの側がカスケード削除を一方的に行うことは非常に珍しいことです。表示が削除されると、マッピングによって関連するムービーとシアターが削除されます。

5

は、ここにあなたが流暢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

私は現在、なぜ私のカスケードを見つけるために探しています削除は機能していません。私が答えを見つけるたびに、もう1行必要なコードがあります;-) – PandaWood

関連する問題