Подтвердить что ты не робот

RavenDB бросает исключение кастинга после изменения пространства имен моделей

В базе данных я уже хранил сотни документов. Теперь архитектура системы изменилась и (среди прочего) модели были перенесены в другое пространство имен (в другой сборке).

Ниже представлены метаданные образца документа:

enter image description here

и код, который я использую для получения такого документа:

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, который содержит список ответов:

enter image description here

В коде тип выглядит следующим образом:

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, это должно быть:

enter image description here.

Пока это список, ошибка возрастает из-за старой $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

4b9b3361

Ответ 1

Ярек, Причина этого вопроса в том, что у вас есть оба типа. Если вы удалите тип QA, он будет работать. Или, вы можете сделать то, что предложил Уайетт и заставить это.

Ответ 2

У меня была такая же проблема, и я сделал это:

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);

Ответ 3

Вам нужно будет исправить файлы 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

Существует также способ сделать это, не пробираясь через коллекцию, но я не уверен, как правильно это сделать.

Ответ 4

После переименования я столкнулся с той же проблемой 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 }
            );
        }