2013-01-03 36 views
5

我們有一個名爲Organization的實體,我們使用UniqueConstraints-bundle。我們有一個名爲NetName的屬性,它是一個UniqueConstraint和一個自動生成的Id。在RavenDB中更改Id的值

由於這是不必要的,我們希望使用NetName屬性作爲Id。所以我們不需要UniqueConstraints來知道它是唯一的,並且在我們擁有NetName的時候也能夠使用Load來獲得好處。

我們需要用它作爲id之前清理我們的網絡名了一點,所以我們創建了一個新的臨時屬性稱爲TempUniqueNetName,現在持有的價值:

"organizations/"+ CleanupId(this.NetName) 

所以我們現在就可以簡單地將該值移至我們的ID。但我們無法實現它的工作。我們的問題是,在下面的PatchRequest中,我們最終得到了一個名爲Id的新屬性,但acctual Id仍然具有相同的值(請參見截圖)。是否有更好的(正確的)方法來更改Id的值?

實體:

class Organization { 
    public string Id { get; set; } 

    [UniqueConstraint] 
    public string NetName { get; set; } 

    public string TempUniqueNetName{ get; set; } 
} 

我們想要做這樣的事情:

_documentStore.DatabaseCommands.UpdateByIndex(typeof(Organizations).Name, 
      new IndexQuery(), 
      new[] 
        { 
         new PatchRequest() 
          { 
           Type = PatchCommandType.Rename, 
           Name = "TempUniqueNetName", 
           Value = new RavenJValue("Id") 
          } 
        }); 

Value has not changed

回答

5

我不認爲你可以改變通過補丁文件的關鍵。它實際上並未與文檔或元數據一起存儲 - 它在加載時被複制到@id元數據中,讓您錯覺它已存在,並且Raven客戶端將其再次複製到文檔中您自己的標識屬性中。但是,真的,它是底層的esent文檔存儲中的一個單獨的值。烏鴉將不得不知道如何處理這個,併爲你僞造。

您可以手動將文檔從舊版本複製到新版本並刪除舊版本,但這可能很耗時。

現在沒有很好的重命名文檔鍵的答案。實際上應該有一個DatabaseCommand用於更新單個文檔,並在修補時將PatchCommandType分隔爲rekey。也許這將在未來被添加到烏鴉。

+0

發佈要求:http://issues.hibernatingrhinos.com/issue/RavenDB-801 –

+0

好的,謝謝你的回答。我們可能會使用您的建議並複製文檔。這是一次性的事情,所以我無所謂,它需要一段時間。希望下次我們需要這個時候它會被執行:) –

+1

僅供參考:RavenDB開發者迴應說他們不會添加這個功能,而是「它可以被用戶實現爲事務性的一對刪除/放置「。 –