NHibernate映射没有向外键引用添加ON DELETE CASCADE选项

csa*_*ano 6 nhibernate nhibernate-mapping

这是我的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>
Run Code Online (Sandbox Code Playgroud)

这是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
)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?谢谢!

Die*_*hon 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>
Run Code Online (Sandbox Code Playgroud)


Sam*_*ack 5

为了补充已接受的答案,以下是您如何使用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
Run Code Online (Sandbox Code Playgroud)