【问题标题】:NHibernate having trouble matching a DateTime objectNHibernate 无法匹配 DateTime 对象
【发布时间】:2017-02-21 01:02:39
【问题描述】:

我在 ASP.NET MVC 中有这个简单的操作

    [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,它抱怨:

"输入字符串 '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; }
}

【问题讨论】:

  • 这是从哪里来的“”输入字符串 '10:00:00' 的格式不正确。” ..... 在我看来它不是 NH 而是映射器
  • 我认为 Keith 可能是对的,与此同时,您能否为您的“事件”课程发布您的 Fluent 地图/XML 地图?
  • 添加Event 类定义也可能有所帮助。异常调用堆栈将有助于检查 Keith 是否正确。
  • @sh1rts 我添加了 Event 类。看看吧。
  • @Frédéric 我添加了堆栈跟踪。看看

标签: c# mysql asp.net datetime nhibernate


【解决方案1】:

DateTime/Time/DateTimeOffset/Date 数据类型上,我总是明确地告诉映射中的预期类型,因为在从底层属性类型推断时可能存在一些歧义(.Net 缺少Date 类型,...)。

通常对于 db DateTime,我在属性映射上指定 NHibernate 类型 timestamp。请参阅可用类型列表on NHibernate reference documentation。根据您的用例,有多种可能的类型可供选择。
您还可以指定一些非 NHibernate 类型,如 in NHibernate reference documentation 所述。

【讨论】:

  • 原来DB中引起问题的列不是DATETIME,而是TIME字段。使用.CustomType("TimeAsTimeSpan"); 解决了这个问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
  • 2014-12-05
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
相关资源
最近更新 更多