代码之家  ›  专栏  ›  技术社区  ›  Buh Buh

实体框架和SqlDateTime溢出最佳实践

  •  5
  • Buh Buh  · 技术社区  · 15 年前

    System.DateTime 可以采用比SQL Server的DateTime更大范围的值。因此有阶级 System.Data.SqlTypes.SqlDateTime 模仿后者。

    因此,我本来希望实体框架选择SqlDateTime,但它没有。

    所以我的问题是。。。

    有没有办法强迫EF使用SqlDateTime?

    3 回复  |  直到 15 年前
        1
  •  4
  •   marc_s MisterSmith    15 年前

    你可以做很多事情:

    • 如果您使用的是SQL Server 2008或更高版本,则可以使用 DATE 或 DATETIME2 数据库上提供与.NET相同日期范围的数据类型 DateTime

    • 如果您不能使用这些新的数据类型,那么在将数据存储到持久性存储之前,将由您来处理对日期字段的一些检查/验证。英孚 EntityObject

        2
  •  1
  •   Hobbes    15 年前

    更具体地说,试试这个: http://www.vfstech.com/?p=111

        3
  •  1
  •   Community Mohan Dere    9 年前

    也许这是一条老线索,但我会把我的发现发布给其他人:

    假设我们有dev env:EF 5、CodeFirst、SqlCE 4.0:

    public abstract class Entity : IEntity, IEquatable<Entity>
    {
    public virtual int Id { get; protected set; }
    public virtual DateTime LastModified { get; set; }
    
    [DataType(DataType.Date)]
    public virtual DateTime CreatedOn { get; set; }
    
    [DataType(DataType.DateTime)]
    public virtual DateTime CreatedOn2 { get; set; }
    
    [DataType(DataType.Time)]
    public virtual DateTime CreatedOn3 { get; set; }
    
    public virtual DateTime CreatedOn4 { get; set; }
    }
    

    使用这样的自定义映射:

    public EntityMapping()
    {
    HasKey(e => e.Id);
    Property(e => e.Id);
    Property(e => e.LastModified).IsRequired().IsConcurrencyToken();
    Property(e => e.CreatedOn).IsRequired();
    Property(e => e.CreatedOn2).IsRequired();
    Property(e => e.CreatedOn3).IsRequired();
    Property(e => e.CreatedOn4).IsRequired();
    }
    

    这就产生了 this ,这意味着我们将有溢出异常。

    在使用SQL CE 4.0时更改对此的映射:

    Property(e => e.CreatedOn).IsRequired().HasColumnType("datetime2");
    Property(e => e.CreatedOn2).IsRequired().HasColumnType("date");
    Property(e => e.CreatedOn3).IsRequired().HasColumnType("date");
    Property(e => e.CreatedOn4).IsRequired().HasColumnType("datetime2");
    

    error . 切换到sqlserverstandart2012似乎解决了这个问题(这不是一个确定的解决方案-只是为了实验)。创建的SQL Server架构是 this .

    SQL CE does not support these dates . 开发环境的问题。遗骸。DateTime可以被替换,但是可以带来很多重构。

    还要记住 SqlDateTime and DateTime are very different .

    对于代码和项目生命周期来说,我发现一个很好的解决方案是在LocalDb和SQL standart之间切换,正如上面stackoverflow中的一个链接所建议的那样,并结合自定义fluentApi映射设置来均衡模型创建或两者。

    介绍 custom convention in EF 作为一个安全网看起来也不错。

    推荐文章