NHibernate Sqldatetime must be between 1/1/1753 and 12/31/9999

I'm using NHibernate in my MVC project. My problem is, while im trying to update an object im getting following error.

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

In debug mode I see the date property is not null. I set Datetime nullable on mapping. But I'm still getting sqldatetime error.

public class EntityBaseMap<T> : ClassMap<T> where T : EntityBase
{
    public EntityBaseMap()
    {
        Id(x => x.Id).GeneratedBy.Identity();
        Map(x => x.IsDeleted).Not.Nullable();
        Map(x => x.CreatedAt).Nullable();
        Map(x => x.UpdatedAt).Nullable();
        Map(x => x.Random).Formula("NEWID()");

        References(x => x.Status).Column("StatusId");

        Where("IsDeleted=0");
    }
}

Datetime properties are not null on save.

public int SaveOrUpdatePage(PageDto PageDto)
{
    var page = PageDto.Id > 0 ? ById<Page>(PageDto.Id) : new Page();
    var status = PageDto.Status.Id > 0 ? LookupById<Status>(PageDto.Status.Id) : null;
    var type = PageDto.Type.Id > 0 ? LookupById<PageType>(PageDto.Type.Id) : null;
    //var parent = PageDto.Parent.Id > 0 ? ById<Page>(PageDto.Parent.Id) : page.Parent;

    page.Description = PageDto.Description;
    page.Title = PageDto.Title;
    page.SpotText = PageDto.SpotText;
    page.Status = status;
    page.Text = PageDto.Text;
    page.Url = !string.IsNullOrEmpty(PageDto.Url) ? PageDto.Url.ToFileName() : PageDto.Title.ToFileName();
    page.Featured = PageDto.Featured;
    page.Type = type;

    using (var tran = UnitOfWork.CurrentSession.BeginTransaction())
    {
        UnitOfWork.CurrentSession.SaveOrUpdate(page);
        tran.Commit();
    }


    page.CreateDirectory();

    if (PageDto.Id == 0)
    {
        page.Copy();
        page.CopyThumbs();
    }

    SetResultAsSuccess();

    return page.Id;
}

I m using SQLServer 2008 and on table datetime columns check with allow null.


This is not an issue of NULL or NULLABLE column. This is an issue of the C# default value of the DateTime ValueType.

default(DateTime) == new DateTime(1,1,1) // 1st January of year 1 

So, because the CreatedAt or UpdatedAt is defined as

public virtual DateTime CreatedAt { get; set; }
public virtual DateTime UpdatedAt { get; set; }

And never set to other than its default value ... the which value is 1.1.0001. And this is less then SQL Server lower bound 1.1.1753...

Other words, be sure that you set these values to some meaningful values, eg DateTime.Now

链接地址: http://www.djcxy.com/p/26974.html

上一篇: 使用Nhibernate和MS sql server插入查询的C#日期时间异常

下一篇: NHibernate Sqldatetime必须介于1/1/1753和12/31/9999之间