更新到2.5.5.2700后的RavenDB DateTime错误

时间:2013-09-08 17:24:45

标签: c# asp.net .net ravendb

更新到最新的RavenDB后,我收到此错误:

  

[InvalidCastException:无法转换类型为“Index_Auto_2fDocuments_2fByCreationDateTimeAndPublishTimeSortByCreationDateTimePublishTime”的对象以键入“Raven.Database.Linq.AbstractViewGenerator”。]      C:\ Builds \ RavenDB-Stable \ Raven.Database \ Linq \ DynamicViewCompiler.cs中的Raven.Database.Linq.DynamicViewCompiler.GenerateInstance():598      C:\ Builds \ RavenDB-Stable \ Raven.Database \ Storage \ IndexDefinitionStorage.cs中的Raven.Database.Storage.IndexDefinitionStorage.AddAndCompileIndex(IndexDefinition indexDefinition):233      C:\ Builds \ RavenDB-Stable \ Raven.Database \ DocumentDatabase.cs中的Raven.Database.DocumentDatabase.PutIndex(String name,IndexDefinition definition):1207      Raven.Database.Queries.DynamicQueryRunner.CreateAutoIndex(String permanentIndexName,Func 1 createDefinition) in c:\Builds\RavenDB-Stable\Raven.Database\Queries\DynamicQueryRunner.cs:170 Raven.Database.Queries.DynamicQueryRunner.GetAppropriateIndexToQuery(String entityName, IndexQuery query, DynamicQueryMapping map) in c:\Builds\RavenDB-Stable\Raven.Database\Queries\DynamicQueryRunner.cs:158 Raven.Database.Queries.DynamicQueryRunner.ExecuteDynamicQuery(String entityName, IndexQuery query) in c:\Builds\RavenDB-Stable\Raven.Database\Queries\DynamicQueryRunner.cs:32 Raven.Client.Embedded.EmbeddedDatabaseCommands.Query(String index, IndexQuery query, String[] includes, Boolean metadataOnly, Boolean indexEntriesOnly) in c:\Builds\RavenDB-Stable\Raven.Client.Embedded\EmbeddedDatabaseCommands.cs:481 Raven.Client.Document.AbstractDocumentQuery 2.ExecuteActualQuery()in c:\ Builds \ RavenDB-Stable \ Raven.Client.Lightweight \ Document \ AbstractDocumentQuery.cs:664      Raven.Client.Document.AbstractDocumentQuery 2.get_QueryResult() in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Document\AbstractDocumentQuery.cs:633 Raven.Client.Linq.RavenQueryProviderProcessor 1.ExecuteQuery()在c:\ Builds \ RavenDB-Stable \ Raven.Client.Lightweight \ Linq \ RavenQueryProviderProcessor.cs:1499      Raven.Client.Linq.RavenQueryInspector 1.GetEnumerator() in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Linq\RavenQueryInspector.cs:105 System.Collections.Generic.List 1..ctor(IEnumerable 1 collection) +446 System.Linq.Enumerable.ToList(IEnumerable 1 source)+80      C:\ Dev \ Repos \ Git \ Writer \ Kernel \ DocumentRavenProvider.cs中的Kernel.DocumentRavenProvider.GetDocuments(Int32计数):85      C:\ Dev \ Repos \ Git \ Writer \ Kernel \ DocumentManager.cs中的Kernel.DocumentManager.GetDocuments(Int32计数):46      C:\ Dev \ Repos \ Git \ Writer \ Blog \ Controllers \ DocumentController.cs中的Blog.Controllers.DocumentController.Index():18      lambda_method(Closure,ControllerBase,Object [])+79      System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary 2 parameters) +261 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary 2个参数)+39      System.Web.Mvc.Async。<> c_ DisplayClass42.b _41()+34      System.Web.Mvc.Async。<> c_ DisplayClass39.b _33()+124      System.Web.Mvc.Async。<> c_ DisplayClass4f.b _49()+838923      System.Web.Mvc.Async。<> c_ DisplayClass37.b _36(IAsyncResult asyncResult)+15      System.Web.Mvc.Async。<> c_ DisplayClass2a.b _20()+33      System.Web.Mvc.Async。<> c_ DisplayClass25.b _22(IAsyncResult asyncResult)+839508      System.Web.Mvc。<> c_ DisplayClass1d.b _18(IAsyncResult asyncResult)+28      System.Web.Mvc.Async。<> c_ DisplayClass4.b _3(IAsyncResult ar)+15      System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult)+65      System.Web.Mvc.Async。<> c_ DisplayClass4.b _3(IAsyncResult ar)+15      System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult)+51      System.Web.Mvc。<> c_ DisplayClass8.b _3(IAsyncResult asyncResult)+42      System.Web.Mvc.Async。<> c_ DisplayClass4.b _3(IAsyncResult ar)+15      System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)+51      System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+606      System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously)+288

执行此查询时

documents = session.Query<Model.Document>().Where(d => d.PublishTime <= DateTime.Now)
.OrderByDescending(document=>document.CreationDateTime).Take(count)

我正在运行嵌入式数据库,我试图

  1. 删除数据库并重启asp.net应用程序。 相同错误
  2. 向数据库添加内容,然后重新启动并加载asp.net应用程序。 相同错误
  3. 在更新之前,一切正常。我有很多单元测试,我测试了一个内存Raven数据库。这里保存和检索工作正常,所以它可能与正在解析的json有关吗?

    我有这个控制器调用底层的RavenDB保存逻辑:

    // POST api/document
            public async System.Threading.Tasks.Task<Model.Document> Post([FromBody]Model.Document document)
            {
                var savedDocument = await _documentManager.Save(document);
    
                var hubConnection = new Microsoft.AspNet.SignalR.Client.Hubs.HubConnection(BaseSiteUrl);
                var hub = hubConnection.CreateHubProxy("DocumentHub");
                hubConnection.Start().Wait();
                hub.Invoke("NewArticle", savedDocument.Id).Wait();
    
                return document;
            }
    

    我的模型看起来像这样

        public class Document
        {
            public int Id { get; set; }
            public string Headline { get; set; }
            public string Text { get; set; }
            public DateTime CreationDateTime { get; set; }
            public DateTime PublishTime { get; set; }
            public HashSet<string> Tags { get; private set; }
            public int CategoryId { get; set; }
    
            [Raven.Imports.Newtonsoft.Json.JsonIgnore]
            public Model.Category Category { get; private set; }
    
            public Document()
            {
                CreationDateTime = DateTime.Now;
                Tags = new HashSet<string>();
            }
    
            public Document(string headline, string text, DateTime creationTime, DateTime publishTime)
            {
                Headline = headline;
                Text = text;
                CreationDateTime = creationTime;
                PublishTime = publishTime;
                Tags = new HashSet<string>();
            }
    
            public string GetCategoryName()
            {
                string name = String.Empty;
    
                if (this.Category != null)
                {
                    name = this.Category.Name;
                }
    
                return name;
            }
    
            public void SetCategory(Model.Category category)
            {
                if (category != null)
                {
                    this.Category = category;
                    this.CategoryId = category.Id;
                }
            }
    
            public string GetTeaser()
            {
                string teaser = Text;
                if (Text.Count() > 250)
                    teaser = Text.Substring(0, 250) + " ...";
    
                return teaser;
            }
    
            public string GetCommaSeperatedTagsString()
            {
                var tags = new StringBuilder();
    
                int i = 0;
                foreach (string tag in Tags)
                {
                    if (!String.IsNullOrEmpty(tag))
                    {
                        tags.Append(tag);
    
                        if (i < Tags.Count - 1)
                        {
                            tags.Append(",");
                        }
                    }
                    i++;
    
                }
    
                return tags.ToString();
            }
    
            public string GetSpaceSeperatedTagsString()
            {
                var tags = new StringBuilder();
    
                int i = 0;
                foreach (string tag in Tags)
                {
                    if (!String.IsNullOrEmpty(tag))
                    {
                        tags.Append(tag);
    
                        if (i < Tags.Count - 1)
                        {
                            tags.Append(" ");
                        }
                    }
                    i++;
    
                }
    
                return tags.ToString();
            }
    
            public void AddTagsString(string tagsString)
            {
                string[] tagsSplitted = tagsString.Split(',');
    
                foreach (var tag in tagsSplitted)
                {
                    if (!String.IsNullOrEmpty(tag))
                    {
                        Tags.Add(tag);
                    }
                }
            }
    
            public string GetTimeString()
            {
                System.TimeSpan span = DateTime.Now.Subtract(this.CreationDateTime);
                string time = "lige udgivet";
    
                if (span.Days > 0)
                {
                    if (span.Days > 1)
                        time = span.Days + " dage siden";
                    else
                        time = "en dag siden";
                }
    
                else if (span.Hours > 0)
                {
                    if (span.Hours > 1)
                        time = span.Hours + " timer siden";
                    else
                        time = "en time siden";
                }
    
                else if (span.Minutes > 0)
                {
                    if (span.Minutes > 1)
                        time = span.Minutes + " minutter siden.";
                    else
                        time = "et minut siden.";
                }
    
                else if (span.Seconds > 0)
                {
                    time = "lige udgivet";
                }
                else if (span.Milliseconds > 0)
                {
                    time = "lige udgivet";
                }
    
                return time;
            }
        }
    
    public class Category
                {
                    public string Name { get; set; }
                    public int Id { get; set; }
                }
    

    但是,如果我打破上面的控制器方法,json转换得很好。这里没有错误。

    RavenDB是否改变了DateTime的处理方式?有没有人知道一个解决方案,或者一篇能指出我正确方向的文章。

    更新 我可以看到这只发生在我尝试查询数据库并获取文档时。这是在空数据库和带有文档的数据库上测试的。我可以看到save方法工作正常。

1 个答案:

答案 0 :(得分:2)

通过从nuget卸载Raven.Embedded并重新安装来解决此问题。