Matthew Goulart
Matthew Goulart

Reputation: 3065

NHibernate having trouble matching a DateTime object

I have this simple action in 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();
        }
    }

Using NHibernate, it complains that:

"Input string '10:00:00' was not in the correct format.

And

Unable to cast object of type 'System.TimeSpan' to type 'System.IConvertible'

The column in the MySQL DB is of type DATETIME. I was using EF6 before, and since converted to NH. This is the last hurdle to complete the transition. Any idea what is causing NH to trip up? Thanks!

EDIT:

Here is the call stack:

   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)

And the event class:

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

Upvotes: 0

Views: 1050

Answers (1)

Fr&#233;d&#233;ric
Fr&#233;d&#233;ric

Reputation: 9854

On DateTime/Time/DateTimeOffset/Date data types, I always tell explicitly the expected type in the mappings, since there may be some ambiguity when inferring from the underlying property type (.Net lacking a Date type, ...).

Usually for a db DateTime, I specify the NHibernate type timestamp on the property mapping. See the list of types available on NHibernate reference documentation. Depending on your use case, there is a bunch of possible types to choose from.
You may also specify some non NHibernate types, as explained in NHibernate reference documentation.

Upvotes: 1

Related Questions