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