2011-08-30 36 views
0

我是通用流利NHibernate和ORM工具的新手。在這種情況下,我不確定我應該期待什麼。我有基金,持有和資產表與相應的對象。基金對象擁有一個集合,每個持有都有一個資產。當我保存基金時,我希望隨後的持股和資產可以保存。我對流利NHibernate有什麼期待?

我似乎有這種情況發生,但是,我似乎試圖插入一個新的記錄到每個表中,而不是更新現有的。我在數據庫中有獨特的約束,所以保存失敗。我是否需要查詢現有持股和資產以使其更新?

我確定已經有這個問題的答案,但我無法弄清楚如何搜索找到它。

在此先感謝。下面的相關映射

public FundMap() 
{ 
... 
HasMany(x => x._holdings) 
    .Cascade.All(); 
} 

public HoldingMap() 
{ 
... 
References(x => x._fund); 
References(x => x._asset).Cascade.SaveUpdate(); 
... 
} 
+1

我很確定這是會話管理的問題。你能顯示失敗的代碼嗎? –

+0

@Stefan,我真的很確定這不是一個會話問題,我實際上得到一個數據庫唯一的約束違反異常消息,並保存工作第一次,正如預期與一個獨特的列,我認爲下面的答案更接近於我沒有提供鍵值,我將不得不查詢數據庫來檢索。我現在不在我的個人機器前面,所以我不能給出確切的信息,但我對我對問題的描述非常有信心。 – kirps

回答

1

您不需要查詢現有集合,這不是必需的。您可以創建一個新對象,併爲其賦予與數據庫中對象相同的鍵,調用SaveOrUpdate()並更新數據庫。

您通常查詢數據庫的原因是因爲您在除密鑰之外的其他標準上搜索。這也抓住了綁定到這個實體的關係對象。在你的情況下,一個「基金」有很多「控股」。

例如, 如果你有在1鍵和與基金和特定的控股相關聯的控股數據庫中的現有基金有1個關鍵,你可以做以下

var fund = new Fund{ 
    ID = 1, 
    Name = "YourNewName", 
    Holdings = new List<Holding>{ 
    new Holding{ 
     ID = 1 
     Description = "NewHoldingDescription" 
    } 
    } 
} 

//and then perform a SaveOrUpdate() on the fund, it should update the entries in the database 
+0

列表屬性(控股)上的公共二傳手是非常糟糕的做法。 –

+0

這看起來不錯,我的二傳手也受到保護,我需要做一些測試,然後才能標記答案,但這對我來說很有意義。 – kirps