【问题标题】:SqlDateTime overflow error when saving DateTime.MinValue on a POCO entity在 POCO 实体上保存 DateTime.MinValue 时出现 SqlDateTime 溢出错误
【发布时间】:2011-07-29 20:48:39
【问题描述】:

我在使用 DateTime 属性保存 POCO 实体时遇到了一些问题。当 DateTime 属性的值为 DateTime.MinValue 时,SaveChanges() 会因为 SqlDateTime.MinValue 和 DateTime.MinValue 之间的差异而失败。

那么,该怎么办?

1) 我应该在保存实体之前检查 DateTime.MinValue 吗?

2) 我应该让我的 datetime POCO 属性设计这样的东西吗?

    private SqlDateTime _created;
    public virtual DateTime Created
    {
        get
        {
            return _created.Value;
        }
        set 
        {
            _created = value == DateTime.MinValue ? SqlDateTime.MinValue : value;
        }
    }

/密码

【问题讨论】:

    标签: entity-framework entity poco datetime2


    【解决方案1】:

    如果可能,我建议将数据库字段设为可空并将值设置为空而不是最小值。

    或者我会这样设计属性:

    private SqlDateTime? _created;
    public virtual DateTime Created
    {
        get
        {
            return (DateTime)(_created ?? SqlDateTime.MinValue);
        }
        set
        {
            if (value == null || value < (DateTime)SqlDateTime.MinValue)
            {
                _created = SqlDateTime.MinValue;
            }
            else 
            {
                _created = (SqlDateTime)value;
            }
        }
    }
    

    【讨论】:

    • 感谢您的回复。一个后续问题。以这种方式处理 POCO 类上的所有 DateTime 属性的一些常见方法怎么样?扩展方法? CustomDateTime 类?或者是重写那些 DateTime 属性来处理 MinValue 的唯一方法?
    • 不客气。扩展方法(我喜欢扩展方法)或自定义类都可以工作。您还可以为其创建具有静态方法的助手类,然后让所有属性都使用该助手。这完全取决于您要使用它的程度。我没有仔细研究过 EntityFramework,但您是否尝试过将列直接映射到 SqlDateTime?也许这将是最简单的解决方案?
    【解决方案2】:

    我能想到的最简单的方法是将DateTime属性初始化为(DateTime)SqlDateTime.MinValue

    public class SomeEntity
    {
        public SomeEntity()
        {
            Updated = (DateTime)SqlDateTime.MinValue;
        }
    
        public DateTime Updated { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多