2013-03-06 31 views
18

是否有可能在使用Code-First模型时全局设置实体框架DbContext以使用datetime2所有属于System.DateTime的属性?强制实体框架5使用datetime2数据类型

我可以通过使用HasColumnType()方法为每列执行此操作,但对于现有的代码库,我想要一个全局解决方案。

+0

只是好奇你为什么要这样做。我问的原因是,当尝试提交具有不可为空的DateTime列(DateTime.MinVal)的默认值的实体时,这是一个非常常见的错误。异常表明您应该使用DateTime2列,但除非您确实需要额外的精度,否则这种情况通常会引起误解。解决方法是为DateTime字段分配一个非默认值,或者将其定义为可为空。希望这可以帮助。 – 2013-03-06 16:35:06

+0

@ w.brian 1)我们有一张储存艺术作品和作者的表格,这些表格可以在1753年以前制作/出生...... 2)如果这是可能的话,那么它可以作为对所有其他人进行最短日期验证的替代方案领域。 3)技术好奇心... – 2013-03-06 16:40:33

+0

难题。只是想确保你没有像我在上面提到的例外时那样,像我最初所做的那样咆哮错误的树。 – 2013-03-06 16:44:39

回答

25

由于EF6已经出现了很长一段时间,并且这个问题仍然显示在搜索中,下面是使用自定义约定来设置SQL类型的方式。在您的DbContext类的OnModelCreating方法内:

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

仅用于新模式吗?因为我在Update-Database上收到此错误消息:ALTER TABLE ALTER COLUMN日期失败,因为一个或多个对象访问此列。 – Jacob 2017-07-07 03:41:38

+1

@Jacob你的意思是说,如果你已经为模型创建了数据库,它会工作吗?是的,但是您必须记住在将约定添加到OnModelCreating之后创建迁移。这是我做到的,所以我知道它的工作原理如果做得对:) – 2017-07-09 10:15:10

+1

由于表约束,我有错误。我解决它通过根据这个答案手动删除它们:https://stackoverflow.com/a/19461205/665783但是,你的答案非常帮助我们。我们通过您发布的代码迁移了我们的整个数据库。谢谢! – Jacob 2017-07-09 13:49:51

7

不在EF5中,但EF6(目前在alpha版本中)允许与custom conventions一起使用。对于EF5,您需要一些基于反射的基于自定义约定的框架,这将通过反射向模型构建器添加HasColumnType调用 - 例如检查EF Code First Extras(它声称支持可插入约定)。