Ответ 1
Ярек, Причина этого вопроса в том, что у вас есть оба типа. Если вы удалите тип QA, он будет работать. Или, вы можете сделать то, что предложил Уайетт и заставить это.
В базе данных я уже хранил сотни документов. Теперь архитектура системы изменилась и (среди прочего) модели были перенесены в другое пространство имен (в другой сборке).
Ниже представлены метаданные образца документа:
и код, который я использую для получения такого документа:
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 возрастает, в то время как у меня есть коллекция указанного типа внутри дозировки, которая теперь изменилась.
В базе данных у меня есть документ Question, который содержит список ответов:
В коде тип выглядит следующим образом:
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 < > , no 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'. ---> 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'.
Каков наилучший способ переноса всех документов для отображения имен текущих типов? Есть ли встроенный механизм?
Btw: Я использую RavenDB - Build # 960
Ярек, Причина этого вопроса в том, что у вас есть оба типа. Если вы удалите тип QA, он будет работать. Или, вы можете сделать то, что предложил Уайетт и заставить это.
У меня была такая же проблема, и я сделал это:
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);
Вам нужно будет исправить файлы ravendb напрямую, не пытаясь их десериализовать. Я никогда не делал этого сам, но я думаю, что магия выполняется с использованием методов, найденных в IDocumentSession.Advanced.DatabaseCommands, особенно Метод исправления.
На самом деле мне нечего тестировать, но я думаю, что код должен выглядеть так:
//s is your document session
var toUpdate = s.Advanced.DatabaseCommands.StartsWith("Setting", 0, 128);
foreach (var d in toUpdate)
{
var p = new PatchRequest();
p.AllPositions = true;
p.Type = PatchCommandType.Modify;
d.Metadata["Raven-Clr-Type"] = "MyNewType";
p.Value = d.ToJson();
s.Advanced.DatabaseCommands.Patch(d.Key, new []{p});
}
// push forward and repeat for all items in collection
Существует также способ сделать это, не пробираясь через коллекцию, но я не уверен, как правильно это сделать.
После переименования я столкнулся с той же проблемой casting exception
.
Как было сказано в предыдущих ответах, я в конечном итоге исправил все мои документы на основе этого фрагмента.
Нам нужно обновить два поля: Raven-Entity-Name
и Raven-Clr-Type
.
Пример
Переименование MyType
в MyNewType
, обновление пространства имен от My.Namespace.MyType
до My.New.Namespace.MyNewType
.
Raven-Entity-Name
необходимо изменить с MyTypes
на MyNewTypes
. Почему множественное число? Подход "Конвенция по конфигурации", как описано здесь.
Raven-Clr-Type
необходимо обновить с My.Namespace.MyType
до My.New.Namespace.MyNewType
.
код
public static void PatchMetadata()
{
var operation = session.Advanced.DocumentStore.DatabaseCommands
.UpdateByIndex(
// You can check your index name in the Studio Under INDEXES.
"Raven/DocumentsByEntityName",
// query that will be performed
new IndexQuery
{
// A collection in RavenDB is a set of documents with the same tag.
// The tag is defined in Raven-Entity-Name.
Query = "Tag:MyTypes"
}, new[]
{
new PatchRequest
{
Type = PatchCommandType.Modify,
Name = "@metadata",
Nested = new[]
{
new PatchRequest
{
Type = PatchCommandType.Set,
Name = "Raven-Entity-Name",
Value = new RavenJValue("MyNewTypes")
}
,
new PatchRequest
{
Type = PatchCommandType.Set,
Name = "Raven-Clr-Type",
Value = new RavenJValue("My.New.Namespace.MyNewType, RavenDbPatching")
}
}
}
},
new BulkOperationOptions() { AllowStale = true }
);
}