Свободное автоматическое сопоставление NHibernate: изменение даты и времени на метку времени - PullRequest
4 голосов
/ 21 мая 2009

Я немного углубился в автоматизацию с помощью свободного интерфейса NHibernate. Очень хорошая вещь, но я столкнулся с небольшой проблемой с DateTimes. Мне нужно изменить формат данных на метку времени, иначе NHibernate усекает миллисекунды.

Я нашел несколько источников информации, лучший из которых был: AutoMapping Info 1 , где он меняет имя столбца и тип свойства. Проблема в том, что произошли изменения в плавных автоматических сопоставлениях, согласно этому документу .

Теперь я не могу понять, как заставить autopping "изменить тип". Я попробовал следующий код, но я застрял. Опять же, я хочу просто сказать автопроизводителю:

Используйте метки времени для DateTime для предотвращения усечения миллисекунд при использовании автоотображения.

Кто-нибудь получил идею? Код до сих пор:

   public class DateTimeToTimestamp : IClassConvention  
{  
    public bool Accept(IClassMap target)
    {
        return target.GetType() == typeof(DateTime);
    }

    public void Apply(IClassMap target)
    {
        throw new NotImplementedException();
    }
}

Хорошо, Большое спасибо за ответ ... Это достаточно комфортно для меня. Если у меня действительно есть 3 класса, которым нужна эта точность, я могу написать три раза. Тем более, что сопоставление всех других свойств работает по-прежнему отлично, а следующий код чередует только одно свойство, которое я хочу ... Очень приятно!

Если кто-нибудь знает более общий подход, не стесняйтесь добавлять его, но сейчас я счастлив!

Код для моего дела:

    public class DateTimeToTimestamp : IAutoMappingOverride<CustomTime>
{
    public void Override(AutoMap<CustomTime> mapping)
    {
        mapping.Map(x => x.ScanDate).CustomTypeIs("timestamp");
    }
}

Ответы [ 3 ]

11 голосов
/ 11 сентября 2010

Чтобы расширить ответ Дерека, чтобы сделать это на более общем уровне, вы должны использовать соглашение об автоматическом отображении:

public class TimestampTypeConvention : IPropertyConvention, IPropertyConventionAcceptance
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Type == typeof (DateTime));
    }

    public void Apply(IPropertyInstance instance)
    {
        instance.CustomType<TimestampType>();
    }
}
2 голосов
/ 10 апреля 2012

Ответ Дани - тот, который нужно использовать, хотя для его работы необходимо внести небольшое изменение в метод Apply (): CustomSqlType ("timestamp") -> CustomType ("Timestamp"). Я подтвердил это, поскольку только что внедрил решение в своем собственном проекте.

Примечание: Я попытался отредактировать ответ Даниэля выше, но не смог, потому что изменение было слишком маленьким, поэтому вот исправленный код:

public class TimestampTypeConvention : IPropertyConvention, IPropertyConventionAcceptance
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Type == typeof (DateTime));
    }

    public void Apply(IPropertyInstance instance)
    {
        instance.CustomType("Timestamp");
    }
}

Кроме того, учитывая то, что я пишу новый пост, вот урезанный пример того, как вы создаете фабрику сессий с Fluent NHibernate, которая использует соглашение, для блага других, которые могут не знать:

var factory = Fluently.Configure()
        .Mappings(m => m.FluentMappings.Conventions.Add(new TimestampConvention()))
        .BuildSessionFactory();

Спасибо этому сообщению за то, что я узнал об этом, так как я видел много других сообщений в сети с этой же проблемой.

2 голосов
/ 21 мая 2009

Вы можете переопределить определенный класс. Не уверен, как это сделать на более общем уровне.

public class AlbumMappingOverride : IAutoMappingOverride<Album>
{
    public void Override(AutoMap<Album> mapping)
    {
        mapping.Map(x => x.Created).CustomSqlTypeIs("timestamp");
    }
}
...