Тип данных NHibernate и SQL 2008 Time - PullRequest
6 голосов
/ 06 октября 2011

Как мне сопоставить тип NHibernate с типом TIME SQL Server? Я использую NH 3.2 и карту за кодом.

public class Schedule
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual TimeSpan Time { get; set; }
}

Вот мой класс картографии

public class ScheduleMapping : ClassMapping<Schedule>
{
    public ScheduleMapping()
    {
        Id(x => x.Id, x => x.Generator(Generators.Native));
        Property(x => x.Name, x => x.NotNullable(true));
        Property(x => x.Time, x => x.NotNullable(true));
    }
}

Теперь, когда я создаю базу данных из этого столбца, «Время» имеет тип BIGINT SQL вместо ВРЕМЕНИ. Я прочитал эту и эту статью, но мне не ясно, как применить любое из этих решений.

=========== РЕДАКТИРОВАТЬ ====================

Я создал и вставил новое расписание следующим образом:

var newSchedule = new Schedule {
                   Name = "My Schedule",
                   Time = new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, 0)
                   };
session.SaveOrUpdate(newSchedule);

Когда эти данные были вставлены (около 7:27 вечера), столбец Time содержал значение «700200000000», которое могло быть тиками, но самое важное, что когда я запрашивал DB для этих значений

var retrievedSchedules = session.QueryOver<Schedule>().List();

свойство Time было правильно установлено на 19: 27. Первоначально я хотел, чтобы свойство Time представляло время, в которое должно выполняться расписание. Несмотря на то, что тип данных SQL Server для этого столбца был определен как BIGINT, а значение представлено в виде (наиболее вероятных) отметок, после извлечения оно было правильно переведено во время, что я и хотел. Это больше не вопрос, но я собираюсь оставить это, надеюсь, для чьей-либо выгоды.

1 Ответ

3 голосов
/ 06 октября 2011

Это, в вашем отображении должно решить вашу проблему:

Property(x => x.Time, x => x => { x.NotNullable(true); x.Type<TimeAsTimeSpanType>(); });

По умолчанию NH будет использовать x.Type<TimeSpanType>() в качестве типа NH для типа clr Time ... который сопоставляется с SQL Server 2008 как bigint.

Посмотрите здесь: http://jameskovacs.com/2011/01/26/datetime-support-in-nhibernate/. Он охватывает различные отображения типа Clr -> NH -> Db для даты и времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...