Как работать с типом данных TIME из SQL Server 2008 с помощью NHibernate? - PullRequest
3 голосов
/ 19 июля 2011

Я использую тип данных TIME из SQL Server 2008, и у меня возникают некоторые проблемы с его настройкой для работы с NHibernate.

public TimeTableEventMap()
{
    Id(x => x.Id)
    Map(x => x.Day).NvarcharWithMaxSize().Not.Nullable();
    Map(x => x.StartTime).Length(4).TimeDataType().Not.Nullable();
    Map(x => x.Endtime).Length(4).TimeDataType().Not.Nullable();
    References(x => x.TimeTable).Not.Nullable().Cascade.All();
    References(x => x.RequiredSettings).Not.Nullable().Cascade.All();
}

/// <summary>
///  MS Sql 2008 date type.
/// </summary>
/// <param name="map"></param>
/// <returns></returns>
public static PropertyPart TimeDataType(this PropertyPart map)
{
   return map.CustomSqlType("time");
}

public class TimeTableEvent
{
    public virtual int Id { get; private set; }
    public virtual DayOfWeek Day { get; set; }
    public virtual DateTime StartTime { get; set; }
    public virtual DateTime Endtime { get; set; }
    public virtual TimeTable TimeTable { get; set; }
    public virtual RequiredSetting RequiredSettings { get; set; }
}   

Я получаю эту ошибку

NHibernate.Exceptions.GenericADOException был перехвачен
Сообщение = не удалось выполнить запрос
[ВЫБЕРИТЕ ВЕРХ (@ p0) this_.TimeTableEventId как TimeTabl1_15_1_, this_.Day как Day15_1_, this_.StartTime как StartTime15_1_, this_.Endtime как Endtime15_1_, this_.TimeTableId как TimeTabl5_15_1_, this_.RequiredSettingsId как Required6_15_1_, requiredse2_.RequiredSettingsId as Required1_10_0_, requiredse2_.BackgroundColor as Backgrou2_10_0_, requiredse2_.Title as Title10_0_ FROM TimeTableEvents this_ внутреннее объединение ОбязательныеНастройки requiredse2_ on this_.RequiredSettingsId = requiredse2_.RequiredSettingsId WHERE this_.TimeTableId in (@ p1)]
Позиционные параметры: # 0> 14
[SQL: SELECT TOP (@ p0) this_.TimeTableEventId в качестве TimeTabl1_15_1_, this_.Day как Day15_1_, this_.StartTime как StartTime15_1_, this_.Endtime как Endtime15_1_, this_.TimeTableId как TimeTabl5_15_1_, this_.RequiredSettingsId как Required6_15_1_, requiredse2_.RequiredSettingsId as Required1_10_0_, requiredse2_.BackgroundColor as Backgrou2_10_0_, requiredse2_.Title as Title10_0_ FROM TimeTableEvents this_ внутреннее объединение ОбязательныеНастройки requiredse2_ on this_.RequiredSettingsId = requiredse2_.RequiredSettingsId WHERE this_.TimeTableId in (@ p1)]
Источник = NHibernate
SqlString = SELECT TOP (@ p0) this_.TimeTableEventId as TimeTabl1_15_1_, this_.Day as Day15_1_, this_.StartTime as StartTime15_1_, this_.Endtime как Endtime15_1_, this_.TimeTableId как TimeTabl5_15_1_, this_.RequiredSettingsId as Required6_15_1_, requiredse2_.RequiredSettingsId as Required1_10_0_, requiredse2_.BackgroundColor as Backgrou2_10_0_, requiredse2_.Title as Title10_0_ FROM TimeTableEvents this_ внутреннее объединение ОбязательныеНастройки requiredse2_ on this_.RequiredSettingsId = requiredse2_.RequiredSettingsId WHERE this_.TimeTableId in (@ p1)

StackTrace:
в NHibernate.Loader.Loader.DoList (ISessionImplementor сеанс, QueryParameters queryParameters)
в NHibernate.Loader.Loader.ListIgnoreQueryCache (ISessionImplementor сеанс, QueryParameters queryParameters)
в NHibernate.Loader.Loader.List (ISessionImplementor сеанс, QueryParameters queryParameters, ISet 1 querySpaces, IType[] resultTypes)<br> at NHibernate.Loader.Criteria.CriteriaLoader.List(ISessionImplementor session)<br> at NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results)<br> at NHibernate.Impl.CriteriaImpl.List(IList results)<br> at NHibernate.Impl.CriteriaImpl.List[T]()<br> at NHibernate.Criterion.QueryOver 1.ListU
at NHibernate.Criterion.QueryOver`1.NHibernate.IQueryOver.ListU
на TimeTableRepo.cs: строка 47
at TimeTableService.cs: строка 43
InnerException: System.FormatException
Сообщение = строка ввода '16: 00: 00 'была неверна формат.
Источник = NHibernate
StackTrace:
в NHibernate.Type.DateTimeType.Get (IDataReader rs, Индекс Int32)
в NHibernate.Type.NullableType.NullSafeGet (IDataReader rs, имя строки)
в NHibernate.Type.NullableType.NullSafeGet (IDataReader rs, String [] имена, сеанс ISessionImplementor, владелец объекта)
в NHibernate.Type.AbstractType.Hydrate (IDataReader rs, имена String [], сеанс ISessionImplementor, владелец объекта)
в NHibernate.Persister.Entity.AbstractEntityPersister.Hydrate (IDataReader rs, идентификатор объекта, объект obj, ILoadable rootLoadable, строка [] [] SuffixedPropertyColumns, Boolean allProperties, ISessionImplementor сессия)
в NHibernate.Loader.Loader.LoadFromResultSet (IDataReader rs, Int32 i, Объект obj, String instanceClass, ключ EntityKey, String rowIdAlias, LockMode lockMode, ILoadable rootPersister, ISessionImplementor сессия)
в NHibernate.Loader.Loader.InstanceNotYetLoaded (IDataReader dr, Int32 i, Ioadable persister, ключ EntityKey, LockMode lockMode, String rowIdAlias, EntityKey необязательныйObjectKey, объект необязательныйObject, IList hydratedObjects, ISessionImplementor session)
в NHibernate.Loader.Loader.GetRow (IDataReader rs, Сохраняется ILoadable [], ключи EntityKey [], необязательный объект Object,EntityKey optionalObjectKey, LockMode [] lockModes, IList hydratedObjects, ISessionImplementor сессия)
в NHibernate.Loader.Loader.GetRowFromResultSet (IDataReader Resultset, ISessionImplementor сессии, QueryParameters queryParameters, [] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey [] ключи LockMode, Логические returnProxies)
в NHibernate.Loader.Loader.DoQuery (сеанс ISessionImplementor, QueryParameters queryParameters, логические returnProxies)
в NHibernate.Loader.Loader.Loader.NoLaRaCemp_Player_Player_Slemp_Player_Omp_PlayerNHibernate.Loader.Loader.DoList (сеанс ISessionImplementor, QueryParameters queryParameters)
InnerException: System.InvalidCastException
Сообщение = Невозможно привести объект типа 'System.TimeSpan' к типу 'System.IConvertible'.
Источник= mscorlib

public List<TimeTableEvent> GetTimeTableEvents(Student student, List<int> timeTableIds)
{
    TimeTableEvent tAlias = null;

    List<TimeTableEvent> allEvents = session.QueryOver<TimeTableEvent>(() => tAlias)
        .Where(Restrictions.In(Projections.Property(() => tAlias.TimeTable.Id), timeTableIds))
        .Fetch(r => r.RequiredSettings).Eager
        .TransformUsing(Transformers.DistinctRootEntity)
        .Take(QueryLimits.TimeTableEvents)
        .List<TimeTableEvent>().ToList();

    return allEvents;
}

Ответы [ 4 ]

3 голосов
/ 02 сентября 2011
1 голос
/ 25 октября 2012

Чтобы выразить ответ VahidN явным образом, когда у вас есть сообщение об ошибке, которое говорит:

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

Это означает, что свойство, которое вы пытаетесь сопоставить, должно быть TimeSpan вместо DateTime.То же самое с DateTimeOffset.

1 голос
/ 02 сентября 2011

Вы должны использовать тип TimeSpan на стороне .NET вместо DateTime (поскольку даты нет), как сказал Дотджо в своем комментарии.

0 голосов
/ 01 сентября 2011

Частичное решение, которое я нашел полезным, - использовать formula=CONVERT(DateTime, <ColumnName>) в отображении.

Существенным недостатком является то, что это полезно только для доступа только для чтения.

...