我有一个名为ReportRequest的[DataContract] NOT NULL列'SubmittedAt'。所以我的DataContract看起来像:
[DataContract]
public class ReportRequest
{
Int32 templateId;
DateTime submittedAt = DateTime.Now;
[DataMember]
public virtual Int32? Id
{
get;
set;
}
public virtual DateTime SubmittedAt
{
get {
return submittedAt;
}
set
{
submittedAt = value;
}
}
}
因为,我已经使用了一个私有变量submittedAt并使用DateTime.Now初始化,
SubmittedAt属性不应该具有相同的值吗?
但是当我打电话给NHibernate时
session.Save(objReportRequest);
我收到错误:
SqlDateTime溢出。必须在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间。
我为什么会收到此错误?
作为现在的解决方法,我已将SubmittedAt属性的getter更改为:
get {
if (submittedAt == DateTime.MinValue)
return DateTime.Now;
else
return submittedAt;
}
答案 0 :(得分:3)
SQL Server最小DateTime值大于DateTime.Min值。因此您无法将最小值保存到数据库中。
答案 1 :(得分:1)
正如Marek Tihkan已经说过:SqlServer无法存储DateTime.MinValue
,它超出了SqlServer的DateTime数据类型的值范围。
最好的建议是使用可空类型:
[DataContract]
public class ReportRequest
{
DateTime? submittedAt = null;
public virtual DateTime? SubmittedAt
{
get {
return submittedAt;
}
set
{
submittedAt = value;
}
}
}
通过SubmittedAt.HasValue
你知道它是否真的被设置为合理的东西。你不应该依赖一些“魔术值”来决定是否初始化一个值。
答案 2 :(得分:0)
这是因为DateTime.MinValue与您可以存储在SQL Server日期时间列中的最小值没有相同的含义。在SQL server datetime列中,您可以存储的最小日期是您在异常堆栈中获得的日期。它是SqlDateTime.MinValue