2017-02-21 71 views
0

我在ASP.NET MVC匹配DateTime對象

[HttpGet] 
    public IEnumerable<EventDTO> Get(int bed, DateTime date) 
    { 
     using (var session = DBSessionFactory.OpenSession()) 
     { 
      return session.Query<Event>() 
       .Where(e => 
        e.Bed.Id == bed 
        && e.Date == date) 
       .ToList() 
       .Select(x => Mapper.Map<EventDTO>(x)) 
       .ToList(); 
     } 
    } 

這個簡單的動作使用NHibernate的NHibernate有麻煩,抱怨說:

「輸入字符串'10:00:00'是不是在正確的格式。

而且

無法投射'System.TimeSpan'類型的對象以鍵入'System.IConvertible'

MySQL DB中的列是DATETIME類型的列。我之前使用過EF6,並且轉換爲NH。這是完成過渡的最後一道障礙。任何想法是什麼導致NH絆倒?謝謝!

編輯:

這裏是調用堆棧:

at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters, IResultTransformer forcedResultTransformer) 
    at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) 
    at NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters) 
    at NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes) 
    at NHibernate.Loader.Hql.QueryLoader.List(ISessionImplementor session, QueryParameters queryParameters) 
    at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.List(ISessionImplementor session, QueryParameters queryParameters) 
    at NHibernate.Engine.Query.HQLQueryPlan.PerformList(QueryParameters queryParameters, ISessionImplementor session, IList results) 
    at NHibernate.Impl.SessionImpl.List(IQueryExpression queryExpression, QueryParameters queryParameters, IList results) 
    at NHibernate.Impl.AbstractSessionImpl.List(IQueryExpression queryExpression, QueryParameters parameters) 
    at NHibernate.Impl.AbstractQueryImpl2.List() 
    at NHibernate.Linq.DefaultQueryProvider.ExecuteQuery(NhLinqExpression nhLinqExpression, IQuery query, NhLinqExpression nhQuery) 
    at NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression) 
    at NHibernate.Linq.DefaultQueryProvider.Execute[TResult](Expression expression) 
    at Remotion.Linq.QueryableBase`1.GetEnumerator() 
    at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
    at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
    at OEETracker.Controllers.Api.EventsController.Get(Int32 bed, DateTime date) in EventsController.cs:line 27 
    at lambda_method(Closure , Object , Object[]) 
    at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters) 
    at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments) 
    at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken) 

而且事件類:

public class Event 
{ 
    public virtual int Id { get; set; } 
    public virtual DateTime Date { get; set; } 
    public virtual TimeSpan StartTime { get; set; } 
    public virtual TimeSpan EndTime { get; set; } 
    public virtual bool Planned { get; set; } 
    public virtual string EngineSN { get; set; } 
    public virtual string Details { get; set; } 
    public virtual EventType Type { get; set; } 
    public virtual Classification Classification { get; set; } 

    public virtual Bed Bed { get; set; } 
    public virtual Subcategory Subcategory { get; set; } 
    public virtual Project Project { get; set; } 
} 
+1

這是從哪裏來的「」輸入字符串'10:00:00'的格式不正確。「.....在我看來,它不是那麼多的NH,但映射器 –

+1

我認爲基思可能是同時,你可以發佈你的「Event」類的Fluent地圖/ XML地圖嗎? – sh1rts

+0

添加'Event'類定義可能也會有幫助,異常調用堆棧將幫助檢查Keith是否正確 –

回答

1

DateTime/Time/DateTimeOffset/Date數據類型,我總是告訴明確的映射預期的類型,因爲從基礎屬性類型(.Net缺少Date類型,...)推斷時可能會有一些不明確之處。

通常對於分貝DateTime,我在屬性映射上指定NHibernate類型timestamp。請參閱可用類型列表on NHibernate reference documentation。根據您的使用情況,有一堆可能的類型可供選擇。
您也可以指定一些非NHibernate類型,如解釋in NHibernate reference documentation所述。

+0

事實證明,數據庫中導致問題的列不是DATETIME,而是TIME字段。使用'.Custo mType(「TimeAsTimeSpan」);'解決了這個問題。謝謝! –