2

流暢な NHibernate を使用して、Project と ProjecSettings の間に 1 対 1 の関連付けを実装する必要があります。

public class ProjectMap : ClassMap<Project>
{
   public ProjectMap()
   {
      Id(x => x.Id)
        .UniqueKey(MapUtils.Col<Project>(x => x.Id))
        .GeneratedBy.HiLo("NHHiLoIdentity", "NextHiValue", "1000",
           string.Format("[EntityName] = '[{0}]'", MapUtils.Table<Project>()))
        .Not.Nullable();

      HasOne(x => x.ProjectSettings)
        .PropertyRef(x => x.Project);
    }
}

public class ProjectSettingsMap : ClassMap<ProjectSettings>
{

    public ProjectSettingsMap()
    {

      Id(x => x.Id)
        .UniqueKey(MapUtils.Col<ProjectSettings>(x => x.Id))
        .GeneratedBy.HiLo("NHHiLoIdentity", "NextHiValue", "1000",
          string.Format("[EntityName] = '[{0}]'", MapUtils.Table<ProjectSettings>()));

      References(x => x.Project)
        .Column(MapUtils.Ref<ProjectSettings, Project>(p => p.Project, p => p.Id))
        .Unique()
        .Not.Nullable();
    }
}

これにより、プロジェクト設定の次の sql が生成されます。

CREATE TABLE ProjectSettings (
  Id                       bigint PRIMARY KEY NOT NULL,
  Project_Project_Id       bigint NOT NULL UNIQUE,
  /* Foreign keys */
  FOREIGN KEY (Project_Project_Id)
    REFERENCES Project()
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
);

私が達成しようとしているのは、FOREIGN KEY (Project_Project_Id) に対して ON DELETE CASCADE を設定することです。そのため、プロジェクトが SQL クエリによって削除されると、その設定も削除されます。どうすればこれを達成できますか?

編集: Cascade.Delete() オプションについては知っていますが、必要なものではありません。FK ステートメントの生成を傍受する方法はありますか?

4

1 に答える 1

1

Fluent-NHibernateはこれを行うことができないようです。

あなたはこれを行うことができます :

HasOne(x => x.ProjectSettings).PropertyRef(x => x.Project).Cascade.Delete();

これは意図したとおりに機能しますが、DDLは変更されず、FNHはDBエンジンを使用するのではなく、プログラムでカスケードを処理します。

于 2012-12-13T16:57:59.530 に答える