使用FNH w / SQL Server 2008,我正在尝试添加一个版本作为时间戳,但遇到SQLDateTime溢出错误,因为该值传递为1/1/0001 12:00:00 AM。我找到了this(也引用了here),但仍然遇到了问题。
// 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数据类型是“datetime”。
我猜它的东西很小而且很愚蠢,但还没找到原因 - 我错过了什么?
编辑:实际“保存”代码的操作方法
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 已添加部分实体&amp;映射
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();
}
}
}
答案 0 :(得分:2)
羞怯!矩
(如果像我这样的任何其他n00b遇到同样的问题,请添加此项)
我终于深入挖掘并意识到我在创建仅适用于FluentMapping的地图时将其配置为使用AutoMapping。恢复使用FluentMapping,版本开始完美运行!
我猜我可能会使用AutoMapping并添加一个约定,该约定将使用CustomType(“Timestamp”)处理名为“Version”的列,但是现在我将使用FluentMapping直到我得到更多的速度。< / p>
答案 1 :(得分:0)
这可能是经典的.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