2012-03-30 49 views
1

我已經繼承了一個數據庫,我試圖將它映射到流利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); 
     } 
    } 
} 

這個偉大的工程,只有一個煩惱:刪除簽名。我可以做,如果我手動刪除簽名它的工作:

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

但我願意做的僅僅是設置在簽收步簽名屬性設置爲null,並有NHibernate的自動刪除的孩子。有沒有辦法設置我的映射來做到這一點?

編輯:設置級聯到「全刪除,孤兒」不可行: Intellisense

回答

0

我最終在Signature上有了一個「ToDelete」屬性,並在保存時手動刪除它們。我不喜歡這個B/C它打破抽象,但它現在工作。

我認爲要真正解決它我想,我將不得不重做表和協會一點。不幸的是,在這種情況下,這是不可能的。

1

嘗試改變級聯設置「全刪除,孤兒」。目前,除了刪除之外,您還可以級聯所有內容,這意味着當您嘗試創建「孤立」記錄時,數據庫將會投訴。通過告訴NHibernate如何處理這個問題(在更新或刪除操作後刪除引用表中的孤立記錄),可以避免這個問題。

瞭解,爲了使NH的級聯工作,引用表的FK必須是可空的,以便NH可以在其第一遍中將它設置爲空(孤立記錄)。 AFAIK,NH目前不提供一種方式來級聯刪除帶有不可空的FK的子記錄。

+0

添加上面的編輯。 Cascade all-delete-orphan對於引用關係是不可能的,我認爲這隻在HasMany上。 – 2012-04-10 04:15:25

+0

upvotes努力。謝謝! – 2012-04-10 14:09:54