2010-12-17 69 views
6

这是我的NHibernate映射。NHibernate映射不添加ON DELETE CASCADE选项外键引用

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

目前,我正在寻找,找出为什么我的级联删除不起作用。每次我找到答案时,都需要一行代码;-) – PandaWood 2012-12-10 05:44:56