2010-11-04 35 views
1

我有一個僱主對象,可以有多個人物:NHibernate的刪除父在很多一對一的關係引起外鍵衝突

//entities 
public class Person { 
    public virtual Guid Id {get;set;} 
    public virtual string Name {get;set;} 
    public virtual Employer CurrentEmployer {get;set;} 
} 

public class Employer { 
    public virtual Guid Id {get;set;} 
    public virtual string Name {get;set} 
    public virtual IList<Person> Employees {get;set;} 
} 

//person to employer mappings 
References(x => x.CurrentEmployer) 
    .Cascade.All() 
    .Column("CurrentEmployerId") 
    .ForeignKey("FK_Person_CurrentEmployer"); 

//employer to person mappings 
HasMany(x=> x.Employees) 
    .Inverse() 
    .Cascade.All(); 

當我嘗試刪除鏈接到一個人的僱主,我獲得「外鍵違規」錯誤。

//example 
_session.Delete(oldEmployer); 

如何讓nHibernate在刪除僱主之前清空CurrentEmployerId列?

回答

0

你有散佈的代碼刪除僱主嗎?我認爲,通常你會在代碼中只有一個地方真的會刪除僱主,所以實際上並沒有必要讓nhibernate爲你做這項工作;只需在那裏更新所有參考員工。

如果實際上確實有這些全部散佈的刪除,那麼您可以創建一個攔截器或事件偵聽器,該偵聽器或事件偵聽器監視對該表的刪除並使攔截器/偵聽器更新引用僱員。

+0

感謝您的想法,但我的一部分要求是,通過nhibernate執行刪除。 – wusher 2010-11-04 20:35:13

+0

在我的兩個解決方案中,您仍然會使用nhibernate執行刪除;在第一個代碼中,你的代碼只是在刪除之前包含一條更新語句,在第二個時候,攔截器/監聽器將執行更新語句以響應查看刪除的發生。 – 2010-11-05 00:59:06

1

嘗試清除所有CurrentEmployer的第一個,然後刪除該員工

public class Employer 
{ 
    public virtual Guid Id {get;set;} 
    public virtual string Name {get;set} 
    public virtual IList<Person> Employees {get;set;} 

    public void UnemployAll() 
    { 
     foreach(var employee in Employees) 
     { 
      employee.CurrentEmployer = null; 
     } 
     Employees = new List<Person>(); // clear it 
    } 
} 

請嘗試以下的(我認爲員工(人)都應該得到更新),我不知道這是否會工作假頂我的頭,但它可能會讓你開始正確的方向。

oldEmployer.UnemployAll(); 
_session.Delete(oldEmplorer); 
0

嘗試做這一個

//employer to person mappings 
HasMany(x=> x.Employees) 
    .Inverse() 
    .Cascade.AllDeleteOrphan(); 

我沒有檢查,但我希望它可以幫助你。

0

Oracle具有內置的級聯刪除功能(基於外鍵約束)。Sybase不。 根據您的數據庫是否支持觸發器之前和之後,您可以使用之前的觸發器創建功能。 Sybase 12沒有這個,它只在觸發器之後有效,所以在sybase上是不可能的。 Sybase 15有觸發器之前,但我還沒有嘗試過,但它應該工作,基本上你手動編寫前觸發器來執行級聯刪除。

如果這個之前的觸發器功能不存在於您的數據庫中,這是不可能的。您必須先刪除父母,然後才能以編程方式刪除子表格行。

就是這樣。

+0

謝謝,但我不想做級聯刪除。我試圖刪除一對多關係的一端而不刪除另一端,但我得到一個FK錯誤。 – wusher 2010-12-16 18:50:10

+0

也許我錯過了一些東西,但它聽起來像是在試圖違反外鍵約束。如果我正確地閱讀了上述內容,則外鍵要求在僱員表中爲僱員表中提及的每個僱主標識都有一個僱主標識。也許我已經倒過來了,而不是休眠專家,所以如果您嘗試刪除僱主,您必須確保沒有員工將僱主編號分配給他們,然後才能刪除僱主。唉唉。我懂了。你問了這個問題。我想我會低頭,我不知道這是一個冬眠的問題。抱歉。 – stu 2010-12-16 20:31:11

相關問題