2010-07-02 118 views
13

我在嘗試遷移現有的Web應用程序以使用RavenDB。RavenDB:爲子文檔生成代碼

我目前在我的Web應用程序中有頁面,它允許您根據querystring中的id查看Categories,SubCategories和Resources。

但是我注意到RavenDB爲聚合根生成ids,但不是爲子實體生成。

我不認爲子類是一個聚合根(一個類有子類),所以我把它作爲我的類文檔的子文檔。

我錯了,使它成爲一個子文檔,因爲我直接通過它的ID傳遞查詢字符串訪問它?但是,如果不是,我應該如何訪問單個SubCategories,因爲RavenDB似乎不會爲不是聚合根的實體生成id?

回答

15

在Raven郵件列表上有關於這種確切情況的long but interesting discussion

簡短的回答是,Raven並沒有設計成這樣做,只有根實體才能獲得一個id,其他的一切都被視爲一個值類型。但是你可以自己實現它,查看線程末尾的代碼示例以獲取信息。

+0

謝謝馬特。這完全描述了我的情況。一旦我擁有足夠的聲望,我就會對你的答案進行投票。 – Andy 2010-07-08 08:45:45

7

我遇到了這個問題,但不讓文檔生成ID,因爲我不覺得它是線程安全的,尤其是對於基於Web的環境。

最終,我決定讓服務器產生使用類似的GenerateDocumentKey方法,這樣的ID對我說:

using (var session = Store.OpenSession()) 
{ 
    if(category.SubCategories != null) 
    { 
     var newSubCategories = data.BankAccounts.Where(x => string.IsNullOrEmpty(x.Id)); 
     foreach (var sc in newSubCategories) 
      sc.Id = session.Advanced.Conventions.GenerateDocumentKey(sc);  
    } 

    session.Store(data); 
    session.SaveChanges(); 
} 

這樣,我允許數據庫生成子ID的,並且可以確保我贏了在實際的課程本身中不需要滿足競賽條件等。

+2

請注意,現在是'Session.Advanced.DocumentStore.Conventions.GenerateDocumentKey(sc)' – 2012-03-05 22:23:05