NHibernate Sqldatetime必须在1/1/1753和12/31/9999之间

时间:2015-06-29 16:14:58

标签: c# sql-server nhibernate

我在我的MVC项目中使用NHibernate。 我的问题是,当我试图更新一个对象时,我得到了跟随错误。

  

SqlDateTime溢出。必须在1/1/1753 12:00:00 AM之间   12/31/9999 11:59:59 PM。

在调试模式下,我看到date属性不为null。我在映射上设置了Datetime nullable。但我仍然得到sqldatetime错误。

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属性不为null。

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;
}

我正在使用SQLServer 2008,并在表datetime列上检查allow null。

1 个答案:

答案 0 :(得分:7)

这不是NULL NULLABLE 列的问题。这是DateTime ValueType的C#默认值的问题。

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

因此,因为CreatedAt或UpdatedAt被定义为

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

并且永远不会设置为默认值以外的值......哪个值为1.1.0001。这比SQL Server下限1.1.1753 ......

换句话说,请务必将这些值设置为某些有意义的值,例如的 DateTime.Now