Версия как метка времени в Fluent NHibernate / SQL Server - PullRequest
0 голосов
/ 30 апреля 2011

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

// 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 ]

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

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

(добавим, если любые другие n00bs, такие как я, столкнутся с той же проблемой)

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

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

0 голосов
/ 30 апреля 2011

Это может быть классический .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

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