2012-08-08 46 views
0

我使用流利的nhibernate將父子關係映射到sql數據庫。
大部分時間我讓父實體保存它的子實體,它們被插入到1個事務中,如果我沒有弄錯,如果我使用.Inverse()和sql標識列,這是不可能的。

我遇到的問題是,在1具體情況下,我想更新子實體和只有子實體。
當我這樣做與我當前的設置的子記錄將失去它的父母的關係(如果父對象爲空)或將完全替換我的父對象(如果我插入一個虛擬父母只有一個ID)。

Nhibernate:直接更新子實體而不會反轉

有誰知道在不影響外鍵的情況下實現單個記錄更新的方法嗎?
我能想到一個手動的sql語句或存儲過程,但我希望有一個nhibernate方式。

我有以下設置(可簡化爲您提供方便):

public ProjectMap() 
{ 
    Table("Project"); 
    Id(p=> p.Id); 
    HasMany(p => p.Risks).Not.LazyLoad(); 
} 

public RiskMap() 
{ 
    Table("ProjectRisk"); 
    Id(r=> r.Id); 
    References(r => r.Project).Column("ProjectId"); 
    Map(r => r.Description); 
} 

public class Project 
{ 
    public virtual int Id { get; set; } 
    public virtual IList<Risk> Risks { get; set; } 
} 

public class Risk 
{ 
    public virtual int Id { get; set; } 
    public virtual string Description{ get; set; } 
    public virtual Project Project { get; set; } 
} 
+2

你想做什麼?你可以發佈有問題的代碼嗎?更新從db加載的現有風險時,如果未手動設置,則Project屬性應保持不變。 – 2012-08-08 10:21:04

+0

因爲我使用之間的肥皂服務(這是一個艱難的要求)我不序列化項目屬性。如果我這樣做了,那麼所有的子項目都會有它的父項目,並且我會有一個連續循環它們(更不用說傳輸的數據了)。即使參考對象在那裏,如果有其他更改,它仍然會被更新。 – Kristof 2012-08-08 10:25:40

+0

爲了明確我在做什麼:mvc網站通過肥皂服務加載一個項目。在客戶端單擊它將1個風險對象發送回網絡服務器以保存在數據庫中。 – Kristof 2012-08-08 10:27:28

回答

0

由於米羅斯拉夫建議我使用的是HQL UPDATE語句現在。

這對我的品味有點混亂,但它完成了工作。

Session.CreateQuery("update Risk set Closed = :completed where Id = :id") 
        .SetInt32("id", id) 
        .SetBoolean("completed", completed) 
        .ExecuteUpdate();