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

时间:2010-10-15 15:58:11

标签: entity-framework sqldatetime

System.DateTime可以采用比SQL Server的DateTime更广泛的值。因此,有System.Data.SqlTypes.SqlDateTime类模仿后者。

因此,我原本期望Entity Framework选择SqlDateTime,但事实并非如此。

所以我的问题是......

当您尝试将DateTime值保存到数据库时,确保DateTime值不会导致问题的最佳做法是什么?

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

3 个答案:

答案 0 :(得分:4)

你可以做很多事情:

  • 如果您使用的是SQL Server 2008或更高版本,则可以使用数据库中的DATEDATETIME2数据类型,这些数据类型提供与.NET {{1}相同的日期范围}

  • 如果您不能使用这些新数据类型,那么在将内容存储到持久性存储之前,您可以自行处理日期字段上的某些检查/验证。 EF DateTime提供了很多方法来利用验证和保存对象的过程 - 选择一种适合您的方法

答案 1 :(得分:1)

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

答案 2 :(得分:1)

也许这是一个旧帖子,但我会在其他人上发表我的发现:

假设我们有开发环境: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。 切换到SQL Server Standart 2012似乎解决了这个问题(这不是一个肯定的解决方案 - 仅适用于实验)。创建的SQL Server架构为this

我不是Sql的专家,但我认为SQL CE does not support these dates。发展环境的问题。遗迹。可以替换DateTime,但可以在这里进行大量的重构。

还要记住SqlDateTime and DateTime are very different

我发现 - 对于代码和项目生命周期 - 的解决方案是在LocalDb和SQL标准之间切换,如上面的一个链接所示,从stackoverflow结合自定义fluentApi映射设置来均衡模型创建或两者。

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

如果有人有更好的全方位解决方案,对于代码和开发生产两者,请发布它。