Версия как метка времени в 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