Свободное поле объединения даты и времени NHibernate в объект DateTime - PullRequest
2 голосов
/ 27 мая 2011

У меня есть таблица базы данных (которую я не могу изменить), которая хранит дату и время в отдельных полях, но у моего класса есть только одно свойство DateTime (Открыто).

DateOpened 2011-05-10 00:00:00.000
TimeOpened 1899-12-30 09:53:00.000

В SQL я мог бы просто сделать

SELECT DateOpened + TimeOpened AS 'Opened'

Как мне сопоставить это в Fluent NHibernate?Я использую Fluent Mapping.

Я пробовал

Map(x => x.Opened).Columns.Add(new string[] { "DateOpened", "TimeOpened" });

, но я получаю следующую ошибку

property mapping has wrong number of columns: CBS.Tigerpaw.Data.ServiceOrder.Opened type: DateTime

Ответы [ 3 ]

2 голосов
/ 30 мая 2011

, если IUsertype является опцией

public class DateTimeUserType : ImmutableUserType
{
    public override object NullSafeGet(IDataReader rs, string[] names, object owner)
    {
        var date = (DateTime)NHibernateUtil.DateTime.NullSafeGet(rs, names[0]);
        var time = (DateTime)NHibernateUtil.DateTime.NullSafeGet(rs, names[0]);
        return new DateTime(date.Year, ..., time.Hours, ...);
    }

    public override void NullSafeSet(IDbCommand cmd, object value, int index)
    {
        DateTime dt = (DateTime)(value ?? DateTime.MinValue);
        NHibernateUtil.DateTime.NullSafeSet(cmd, dt.Date, index);
        NHibernateUtil.DateTime.NullSafeSet(cmd, new DateTime(1899, 12, 30, dt.Hours, dt.Minutes, dt.Seconds), index + 1);
    }

    public override Type ReturnedType
    {
        get { return typeof(DateTime); }
    }

    public override SqlType[] SqlTypes
    {
        get { return new[] { SqlTypeFactory.DateTime, SqlTypeFactory.DateTime }; }
    }
}



Map(x => x.Opened)
    .Columns.Add("DateOpened", "TimeOpened")
    .CustomType<DateTimeUserType>();
1 голос
/ 27 мая 2011

вы можете определить это DateOpened + TimeOpened, используя .Map(...).Formula(...) & дополнительное свойство в вашем классе, который имеет частный установщик.

0 голосов
/ 27 мая 2011

Вы можете рассмотреть возможность сопоставления двух отдельных столбцов независимо, и тогда ваш класс предлагает дополнительное (и не сопоставленное) свойство «Открытый», которое объединяет их значения.К сожалению, два сопоставленных свойства по-прежнему будут видны как общедоступные свойства, поскольку Fluent NHibernate требует этого, чтобы их могли получить лямбда-выражения в классе сопоставления.

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