.net RavenDB在模型名称空间更改后引发强制转换异常

.net RavenDB在模型名称空间更改后引发强制转换异常,.net,ravendb,.net,Ravendb,在数据库中,我已经存储了数百个文档。现在,系统架构已经改变,并且(除其他外)模型被迁移到不同的名称空间(在不同的程序集中) 下面是示例文档的元数据: 以及我用来获取此类文档的代码: var configuration = documentSession.Load<One.Social.Core.Entities.Setting>("Setting"); 更新: 类似的错误来自NewtonsoftJson,而我在dosument中有指定类型的集合,现在已经更改了 在数据库中,我有一

在数据库中,我已经存储了数百个文档。现在,系统架构已经改变,并且(除其他外)模型被迁移到不同的名称空间(在不同的程序集中)

下面是示例文档的元数据:

以及我用来获取此类文档的代码:

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

类似的错误来自NewtonsoftJson,而我在dosument中有指定类型的集合,现在已经更改了

在数据库中,我有一个问题文档,其中包含一个答案列表:

在代码中,类型如下所示:

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; }        
    }
}
迁移所有文档以反映当前类型名称的最佳方法是什么?是否有任何内置机制


顺便说一句:我正在使用RavenDB-Build#960

您需要直接修补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
还有一种方法可以做到这一点,而无需在整个集合中循环,但我不确定如何正确地实现这一点。

Jarek, 出现此问题的原因是两种类型都有。 如果删除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);

在重命名后,我面临着完全相同的
铸造异常问题。
正如在前面的回答中所建议的那样,我最终根据以下内容修补了所有文档

我们需要更新两个字段:
Raven Entity Name
Raven Clr Type

示例

MyType
重命名为
MyNewType
,将命名空间从
My.namespace.MyType
更新为
My.New.namespace.MyNewType

Raven实体名称
需要从
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 }
            );
        }

要在不遍历所有文档的情况下执行此操作,您可以使用基于集合的操作,请参阅Thank Matt,如果您在玩弄元数据,则不确定这些操作是否有效。谢谢您的提示。如果我在文档中有一个某种类型的集合,而集合类型名称空间发生了变化,该怎么办?(见更新)首先,我要听从阿耶恩德。他发明了这个东西:)。我认为同样的一般技术也适用。您必须查询数据文档(在上面的示例中为d)以查找属性,然后相应地修改它。可以在同一个补丁中发布。谢谢,我确实有第二种类型。删除后,raven自动将文档元信息更改为当前类型“raven Clr type”:“One.Social.Ask.Web.Models.Setting,One.Social.Ask.Web”。你能看看我问题的最新进展吗?我还有一个类似的问题。我也遇到过同样的问题,我甚至无法从RavenDB Studio中删除文档。这是因为旧的clr类型仍然存在于插件中!我不得不停止ravendb,删除插件,重新启动ravendb,通过studio删除所有文档(它现在起作用了),然后再次停止ravendb,重新安装插件,再次启动ravendb。
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);
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 }
            );
        }