2010-10-15 218 views
5

System.DateTime可以采用比SQL Server的DateTime更广泛的值。因此有类System.Data.SqlTypes.SqlDateTime模仿后者。实体框架和SqlDateTime溢出最佳实践

因此,我会期望实体框架选择SqlDateTime,但它没有。

所以我的问题是...

什么,以确保当您试图将它们保存到你的数据库中的日期时间值不会造成问题的最佳做法是什么?

有什么办法强制EF使用SqlDateTime?

回答

4

有许多事情可以做:

  • ,如果你使用SQL Server 2008或更高版本,可以使用DATEDATETIME2数据类型,并提供相同的日期范围为数据库.NET的DateTime

  • 如果你不能使用这些新的数据类型,那么在事物存储到持久存储区之前,将由你来处理日期字段上的一些检查/验证。 EF EntityObject提供了大量的方法来打入验证和保存对象的过程 - 挑一分的办法,为你的作品

1

也许这是一个古老的线程,但我将张贴在此我发现了别人:

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

我不是Sql的专家,但在我看来,SQL CE does not support these dates。开发环境的问题。遗迹。 DateTime可以替代,但可以带来很多重构在这里和其他地方。

还记得SqlDateTime and DateTime are very different

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

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

如果有人有更好的全面解决方案,代码和开发生产都发布它。