Dot-Net

模型命名空間更改後,RavenDB 拋出強制轉換異常

  • May 9, 2016

在數據庫中,我已經儲存了數百個文件。現在系統架構發生了變化,並且(除其他外)模型被遷移到不同的命名空間(在不同的程序集中)。

下面顯示了範例文件的元數據:

在此處輸入圖像描述

和我用來獲取此類文件的程式碼:

var configuration = documentSession.Load<One.Social.Core.Entities.Setting>("Setting");

拋出鑄造異常:

[InvalidCastException: Unable to cast object of type 'One.QA.Core.Entities.Setting' to type 'One.Social.Core.Entities.Setting'.]

更新:

類似的錯誤,但來自 NewtonsoftJson 上升,而我在文件中收集了指定類型,現在已更改。

在數據庫中,我有問題文件,其中包含答案列表:

在此處輸入圖像描述

在程式碼中,類型如下所示:

namespace One.Social.Ask.Web.Models
{
   public class Question
   {        
       public string Content { get; set; }
       public IList<One.Social.Ask.Web.Models.Answer> Answers { get; set; }        
   }
}

答案命名空間已更改。另外,現在它是從 IList<> 派生的,沒有 ICollection<>。我現在不需要$type元數據,它應該是:

在此處輸入圖像描述.

雖然它現在是一個列表,但由於舊$type資訊而出現錯誤:

Newtonsoft.Json.JsonSerializationException: Error resolving type specified in JSON 'System.Collections.ObjectModel.Collection`1[[One.QA.Core.Entities.Answer, One.QA.Core]], mscorlib'. ---&gt; Newtonsoft.Json.JsonSerializationException: Could not find type 'System.Collections.ObjectModel.Collection`1[[One.QA.Core.Entities.Answer, One.QA.Core]]' in assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.

遷移所有文件以反映目前類型名稱的最佳方法是什麼?有沒有內置機制?

順便說一句:我正在使用 RavenDB - Build #960

Jarek,問題的原因是你有兩種類型。如果您刪除 QA 類型,它將正常工作。或者,您可以按照 Wyatt 的建議進行操作並強制執行此操作。

我遇到了同樣的問題,最終這樣做了:

Advanced.DatabaseCommands.UpdateByIndex(
   "Raven/DocumentsByEntityName",
       new IndexQuery {Query = "Tag:Album"},
       new []{ new PatchRequest() { 
           Type = PatchCommandType.Modify, 
           Name = "@metadata", 
           Nested= new []{ 
               new PatchRequest{
                   Name= "Raven-Clr-Type",
                   Type = PatchCommandType.Set,
                   Value = "Core.Model.Album, Core" }}}},
       false);

引用自:https://stackoverflow.com/questions/11224248