System.DateTime
可以采用比SQL Server的DateTime更广泛的值。因此,有System.Data.SqlTypes.SqlDateTime
类模仿后者。
因此,我原本期望Entity Framework选择SqlDateTime,但事实并非如此。
所以我的问题是......
当您尝试将DateTime值保存到数据库时,确保DateTime值不会导致问题的最佳做法是什么?
有没有办法强迫EF使用SqlDateTime?
答案 0 :(得分:4)
你可以做很多事情:
如果您使用的是SQL Server 2008或更高版本,则可以使用数据库中的DATE
或DATETIME2
数据类型,这些数据类型提供与.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作为安全网介绍看起来也不错。
如果有人有更好的全方位解决方案,对于代码和开发生产两者,请发布它。