Версия как метка времени в Fluent NHibernate / SQL Server

Используя FNH с SQL Server 2008, я пытаюсь добавить версию в качестве метки времени, но сталкиваюсь с ошибкой переполнения SQLDateTime, поскольку значение передается как 01.01.0001 12:00:00 AM. Я нашел это (также упомянуто здесь), но все еще испытываю проблему.

// entity base
public abstract class EntityBase
{
    public virtual Int64 Id { get; set; }
    public virtual DateTime Version { get; set; }
}

// entity base map
public abstract class EntityBaseMap<T> : ClassMap<T> where T : EntityBase
{
    public EntityBaseMap()
    {
        Id(x => x.Id).GeneratedBy.Identity();
        OptimisticLock.Version();
        Version(x => x.Version)
           .CustomType("Timestamp");

    }
}    

Тип данных SQL Server - "время-дата".

Я предполагаю, что это что-то маленькое и глупое, но пока не нашел причину - что мне не хватает?

РЕДАКТИРОВАТЬ: метод действия для фактического "сохранить" код

    public ActionResult Create()
    {
        int currMaxSortOrder = session.CreateCriteria(typeof(Section))
                            .SetProjection(Projections.ProjectionList().Add(Projections.Max("Sortorder")))
                            .UniqueResult<int>();
        SectionViewModel sectionViewModel = new SectionViewModel();
        sectionViewModel.Sortorder = currMaxSortOrder + 1;
        return View("Create", "_AdminLayout", sectionViewModel);
    }

    [HttpPost]
    public ActionResult Create(SectionViewModel sectionInputModel)
    {
        if (ModelState.IsValid)
        {
            section = new Section();
            Mapper.Map(sectionInputModel, section);
            using (var tx = session.BeginTransaction())
            {
                session.SaveOrUpdate(section);
        tx.Commit();
            }
            return RedirectToAction("index", "pages").WithFlash(new { success = "Section '" + section.Name + "' was successfully added." });
        }
        return View("Create", "_AdminLayout", section);
    }

Редактировать 2: добавлен раздел сущности и отображение

    public class Section : EntityBase
    {
        public virtual String Name { get; set; }
        public virtual int Sortorder { get; set; }
        public virtual String RedirectUrl { get; set; }
        public virtual IList<Page> Pages { get; set; }

        public Section()
        {
            Pages = new List<Page>();
        }

        public virtual void AddPage(Page page)
        {
            page.Section = this;
            this.Pages.Add(page);
        }
    }

    public class SectionMap : EntityBaseMap<Section>
    {
        public SectionMap()
        {
            Map(x => x.Name);
            Map(x => x.Sortorder);
            Map(x => x.RedirectUrl);
            // one to many relationship
            HasMany(x => x.Pages)
                .Inverse()
                .Cascade.All();
        }
    }
}

2 ответа

Решение

зову Доу! момент

(Добавление этого в случае, если другие nbsb, как я, столкнутся с той же проблемой)

Наконец, я начал копать глубже и понял, что настроил его на использование AutoMapping при создании карт, которые будут работать только с FluentMapping. Вернулся к использованию FluentMapping и Версия начала работать отлично!

Я предполагаю, что мог бы использовать AutoMapping и добавить соглашение, которое будет обрабатывать столбец с именем "Version" с CustomType("Timestamp"), но сейчас я собираюсь использовать FluentMapping, пока я не достигну скорости.

Это может быть классический.NET min datetime!= SQL Server min datetime.

Минимальное значение даты и времени в.NET указано в 0001 году, но в SQL-сервере минимальная дата может быть меньше 1753 года. Вы получаете переполнение в SQL Server, поскольку тип даты и времени в SQL не может хранить дату, которую вы Пытаешься пройти.

Возможно, вам повезет больше с типом datetime2, но я не уверен в совместимости с Hibernate.

См. Эту статью для получения дополнительной информации: http://blog.malevy.net/2010/01/datetimeminvalue-sql-server-minimum.html

Другие вопросы по тегам