文档对象上的RavenDB命名空间更改会引发“无法转换对象”错误

时间:2013-06-25 22:34:19

标签: c# ravendb

所以我只是想让RavenDB运行起来并且我已经遇到了几个问题,但最终还是让它工作了。我能够成功插入和拉出记录以供显示。

但是,我决定将用于生成文档的类移动到另一个导致命名空间更改的位置。我跑了一切,我仍然可以将文件插入Raven。但是当我尝试将它们用于显示目的时,我收到以下错误:

  

无法将类型为“Library.Logging.RewardProviderLog”的对象强制转换为“Admin.ViewModels.ImportMonitorViewModel”。

因此,在浏览了我可以在网上找到的所有其他帖子之后,似乎该问题与Raven-Clr-Type有关,它基本上跟踪您保存为文档的对象的命名空间信息。

确定。所以我进去并删除了我创建的所有文档,因为我还在测试并尝试运行。我甚至开始吹走索引并重新创建它。我运行了插入新日志的过程。但是当我尝试拉出并显示它们时,我仍会收到相同的错误消息。

注意:ViewModels.ImportMonitorViewModel和Library.Logging.RewardProviderLog是相同的。它们包含完全相同的属性。

更新

索引(名为ImportMonitorLogs):

from doc in docs.RewardProviderLogs 
select new {doc.status, doc.newItemsCount, doc.additionalInfo, doc.lastRun};

查询:

DocumentStore RavenDBStore = new Raven.Client.Document.DocumentStore { Url = "myurl" };
RavenDBStore.DefaultDatabase = "yei-logs";
RavenDBStore.Initialize();Raven.Client.Indexes.IndexCreation.CreateIndexes(System.Reflection.Assembly.GetCallingAssembly(), RavenDBStore);

        using(var session = RavenDBStore.OpenSession())
        {
            model = (from log in session.Query<ViewModels.ImportMonitorViewModel>("ImportMonitorLogs")
                     orderby log.lastRun descending
                     select log).ToList();
        }

1 个答案:

答案 0 :(得分:2)

除了重命名和之前可能有用的内容之外,错误与您尝试的查询相匹配。您正在索引RewardProviderLog类型的文档,并直接将其检索为ImportMonitorViewModel类型。

你说两个类中的所有属性都是相同的,但仅凭这一点并不能让RavenDB为你打包它们。你必须更明确一点。这可能会奏效:

model = (from log in session.Query<RewardProviderLog>("ImportMonitorLogs")
         orderby log.lastRun descending
         select log).As<ViewModels.ImportMonitorViewModel>().ToList();

或者如果你想要稍微清晰的语法(恕我直言),这是等效的:

model = session.Query<RewardProviderLog>("ImportMonitorLogs")
               .OrderByDescending(x=> x.lastRun)
               .As<ViewModels.ImportMonitorViewModel>()
               .ToList();

这里的关键是您根据与索引返回的实体匹配的类型进行查询,并使用As方法将其类型化为视图模型。 (这与OfType<T>相同,您可以在文档here中阅读更多内容。

如果您希望获得更多的爱好者并直接从索引中投射不同的字段或项目,您可以在文档here中查看AsProjection

如果你还在为此之前的原因而烦恼,我可以看到,如果你的viewmodel实体被命名为同一个东西,它可能会起作用 - 即使它们来自不同的命名空间。它们仍然具有相同的Raven-Entity-Name元数据值。