NHibernate映射不添加ON DELETE CASCADE选项外键引用
问题描述:
这是我的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
)
我在做什么错?谢谢!
答
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>
答
NHibernate的级联设置不生成级联外键。它控制在会话刷新时NHibnerate将采取的行动。
此外,关系的许多方面将级联删除到一边是非常罕见的。删除显示时,您的映射会删除相关的影片和剧场。
答
为了补充公认的答案,这里是你如何与功能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
目前,我正在寻找,找出为什么我的级联删除不起作用。每次我找到答案时,都需要一行代码;-) – PandaWood 2012-12-10 05:44:56