我在我的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。
答案 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
强>