强制Entity Framework 5使用datetime2数据类型

24

是否有可能在使用Code-First模型时全局设置Entity Framework的DbContext,以便所有System.DateTime属性均使用datetime2

我可以使用HasColumnType()方法为每个列设置此项,但对于现有代码库,我希望有一个全局解决方案。


只是好奇你为什么要这样做。我问的原因是,在尝试提交具有非空 DateTime 列的默认值的实体时,这是一个非常常见的错误(DateTime.MinVal)。异常指示您应使用 DateTime2 列,但除非您确实需要额外的精度,否则这基本上是误导性的。解决方法是为 DateTime 字段分配非默认值,或将其定义为可空。希望这可以帮助到您。 - w.brian
1)我们有一个存储艺术品和作者的表格,两者都可以在1753年之前制作/出生... 2)如果这是可能的,它将成为其他每个字段的最小日期验证的替代方案。 3)技术上的好奇心... - Knaģis
明白了。我只是想确认一下,你是否像我刚开始遇到异常时走错了方向。 - w.brian
1
@w.brian 即使错误是由于 DateTime.MinVal,强制使用 DateTime2 也是合理的。引用 MSDN 的话:对于新工作,请使用时间、日期、datetime2 和 datetimeoffset 数据类型。 - user247702
1
@w.brian 现在再也没有使用 datetime 的理由了。 datetime2 允许更大的日期范围,更精确,并且如果选择更少的精度,则使用更少的存储空间。所述错误不是切换的唯一原因。 - Kyle
2个回答

36

由于EF6已经发布了一段时间,但是这个问题仍然出现在搜索结果中,下面是使用自定义约定设置SQL类型的方法。在DbContext类中的OnModelCreating方法中执行以下操作:

modelBuilder.Properties<DateTime>()
    .Configure(c => c.HasColumnType("datetime2"));

这只针对新模型吗?因为我在Update-Database上收到了这个错误消息:ALTER TABLE ALTER COLUMN Date失败,因为一个或多个对象访问了此列。 - Jacob
1
@Jacob 你的意思是如果已经为模型创建了数据库,它是否能够工作?是的,但是在添加OnModelCreating约定后,您必须记得创建迁移。这就是我做的方式,所以我知道如果正确执行,它是有效的 :) - Søren Boisen
1
我遇到了由于表约束而导致的错误。根据这个答案:https://dev59.com/72Ik5IYBdhLWcg3wPL7R#19461205,我通过手动删除它们来解决问题。然而,你的答案对我们非常有帮助。我们通过你发布的代码迁移了整个数据库。谢谢! - Jacob

7
在EF5中不支持,但在EF6(目前是alpha版本)中可以使用自定义约定来实现。对于EF5,您需要基于反射的一些自定义约定框架,通过反射向模型生成器添加HasColumnType调用 - 例如检查EF Code First Extras(它声称支持可插拔约定)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接