C# NHibernate Sqldatetime必须介于1753年1月1日和9999年12月31日之间

C# NHibernate Sqldatetime必须介于1753年1月1日和9999年12月31日之间,c#,sql-server,nhibernate,C#,Sql Server,Nhibernate,我正在MVC项目中使用NHibernate。 我的问题是,当我试图更新一个对象时,我遇到了以下错误 SqlDateTime溢出。必须在1753年1月1日12:00:00 AM和 1999年12月31日晚上11:59:59 在调试模式下,我看到date属性不为null。我将映射上的Datetime设置为空。但我仍然得到sqldatetime错误 public class EntityBaseMap<T> : ClassMap<T> where T : EntityBase

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

SqlDateTime溢出。必须在1753年1月1日12:00:00 AM和 1999年12月31日晚上11:59:59

在调试模式下,我看到date属性不为null。我将映射上的Datetime设置为空。但我仍然得到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");
    }
}
public类EntityBaseMap:ClassMap其中T:EntityBase
{
公共实体BaseMap()
{
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()”);
引用(x=>x.Status).Column(“StatusId”);
其中(“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;
}
public int SaveOrUpdatePage(PageDto到PageDto)
{
var page=PageDto.Id>0?ById(PageDto.Id):新页面();
var status=PageDto.status.Id>0?LookupById(PageDto.status.Id):null;
var type=PageDto.type.Id>0?lookupbyd(PageDto.type.Id):null;
//var parent=PageDto.parent.Id>0?ById(PageDto.parent.Id):page.parent;
page.Description=PageDto.Description;
page.Title=PageDto.Title;
page.SpotText=PageDto.SpotText;
页面状态=状态;
page.Text=PageDto.Text;
page.Url=!string.IsNullOrEmpty(PageDto.Url)?PageDto.Url.ToFileName():PageDto.Title.ToFileName();
page.Featured=PageDto.Featured;
page.Type=Type;
使用(var-tran=UnitOfWork.CurrentSession.BeginTransaction())
{
UnitOfWork.CurrentSession.SaveOrUpdate(第页);
trans.Commit();
}
page.CreateDirectory();
如果(PageDto.Id==0)
{
page.Copy();
page.CopyThumbs();
}
SetResultAsSuccess();
返回页面.Id;
}

我正在使用SQLServer2008和表上的datetime列检查允许null。

这不是
null
或可空列的问题。这是
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。现在

页面中的
日期时间
可以为空,而在
页面中设置为
。我尝试设置DateTime。现在,保存或更新(第页)之前的两个日期都可以为空。所以我相信这些都是有意义的价值。可能是。。。但可以肯定的是,问题是不同的。很简单-几乎总是-我是说99,98%的情况下,这个问题意味着:有一个
DateTime
属性而不是
DateTime?
。该属性未设置自定义值,仅保留默认值1.1.0001。仔细检查异常(您将看到哪个列是错误的),然后确保它的值(在调试中)保留在
默认值(DateTime)
。。。希望它能帮上忙是的这很有帮助,有没有办法在保存时找到格式错误的记录?是的。测试/单元测试。我尽我所能让所有(实际上几乎所有)实体都接受基本的CRUD测试,以确保它们通过了MappingDB。若这些测试失败,将得到具有非常描述性信息的完整堆栈异常。NHibernate确实有很好的例外系统。只要观察完整的堆栈,您就会看到清晰的答案。。。换句话说,我建议——创建您自己的测试,并开始从“可持续和可维护的”开发中获益——由测试驱动。我是认真的,这是我唯一能找到的。。。在短期以外的任何时间工作。。。这使衰老吗?回答得很好。另一个选择是在数据库上设置默认日期,这样你就不需要记住在c#中设置它们,因为我需要记住这些我总是忘记的事情!