NHibernate - 为什么我的DateTime属性总是DateTime.MinValue

时间:2009-11-04 11:01:14

标签: nhibernate

我有一个名为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; 
        }

3 个答案:

答案 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