5

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

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

所以我的问题是...

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

有什么方法可以强制 EF 使用 SqlDateTime?

4

3 回答 3

4

你可以做很多事情:

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

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

于 2010-10-15T17:04:51.233 回答
1

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

于 2011-01-04T19:44:40.870 回答
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");

给出这个错误。切换到 SQL Server Standart 2012 似乎可以解决问题(这肯定不是解决方案 - 仅用于实验)。创建的 SQL Server 架构是这样的。

我不是 Sql 专家,但在我看来SQL CE 不支持这些日期。开发环境的问题。遗迹。DateTime 可以被替换,但可以在这里和这里带来很多重构。

还要记住SqlDateTime 和 DateTime 是非常不同的

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

在 EF中引入自定义约定作为安全网看起来也不错。

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

于 2013-09-26T08:30:58.843 回答