2012-03-30 12 views
1

私はデータベースを継承しており、それをFluent NHibernateにマップしようとしています。 私は、次のスキーマがあります。HasOneまたは参考資料ですか?

CREATE TABLE [Signatures](
    [Id] [int] IDENTITY(1,1) PRIMARY KEY CLUSTERED NOT NULL, 
    -- Other Fields.... 
) 

CREATE TABLE [SignoffSteps](
    [Id] [int] IDENTITY(1,1) PRIMARY KEY CLUSTERED NOT NULL, 
    [SignatureId] [int] NULL REFERENCES [Signatures]([Id]), 
    -- Other Fields.... 
) 

をそして、私は(エクストラプロパティとマッピングは省略)次 にマップしようとしています:

public class SignoffStep 
{ 
    public virtual int Id { get; set; } 
    public virtual Signature Signature { get; set;} 

    public class Map : ClassMap<SignoffStep> 
    { 
     public Map() 
     { 
      Table("SignoffSteps"); 
      Id(x => x.Id); 

      References(x => x.Signature, "SignatureId") 
       .Nullable() 
       .ForeignKey("FK_SingoffSteps_Signatures") 
       .Cascade.All() 
       .Not.LazyLoad(); 
     } 
    } 
} 

public class Signature 
{ 
    public virtual int Id { get; set; } 

    public class Map : ClassMap<Signature> 
    { 
     public Map() 
     { 
      Table("Signatures"); 
      Id(x => x.Id); 
     } 
    } 
} 

これは、1人の迷惑を除いて、素晴らしい作品:署名を削除します。

session.Delete(signoffStep.Signature); 
signoffStep.Signature = null; 

をしかし、私はちょうどnullにサインオフステップに署名プロパティを設定してやりたい、とNHibernateは、自動的に子を削除する必要があるだろう:私は手動で署名を削除する場合はそれを動作させることができます。これを行うために私のマッピングをセットアップする方法はありますか?

EDIT:なんとかない「全削除 - 孤児」にカスケードの設定: Intellisense

答えて

0

署名に「ToDelete」プロパティがあり、保存中に手作業で削除しました。私はこれを好きではない/それは抽象を破るが、今のところ働く。

私は本当にそれを修正したいと思っています。私はテーブルと関連付けをやり直す必要がありました。残念なことに、これはこの場合の問題ではありませんでした。

1

「全削除 - 孤児」にカスケードの設定を変更してみてください。現在、EXCEPTが削除するすべてのデータをカスケードしています。つまり、 "孤立した"レコードを作成しようとするとDBがエラーを発することになります。 Hibernateにこれをどう対処するか(更新または削除操作後に参照されたテーブルの孤立したレコードを削除する)、問題を回避します。

NHのカスケーディングを機能させるには、参照テーブルのFKをNULLにする必要があることを理解してください。NHは最初のパスでnullを設定することができます(レコードの孤立)。 AFAIK、NHは現在、Nullを許可しないFKを持つ子レコードのカスケード削除方法を提供していません。

+0

上記の編集を追加しました。 Cascade all-delete-orphanはReferencesの関係では使用できません。HasManyにしかないと思います。 –

+0

努力のためのUpvotes。ありがとう! –

関連する問題