版本作为Fluent NHibernate / SQL Server中的时间戳

时间:2011-04-29 23:58:40

标签: sql-server asp.net-mvc fluent-nhibernate version

使用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();
        }
    }
}

2 个答案:

答案 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