C# 强制实体框架5使用datetime2数据类型

C# 强制实体框架5使用datetime2数据类型,c#,entity-framework,ef-code-first,entity-framework-5,C#,Entity Framework,Ef Code First,Entity Framework 5,在使用代码优先模型时,是否可以全局设置实体框架DbContext以对所有System.DateTime属性使用datetime2 我可以通过使用HasColumnType()方法对每一列执行此操作,但对于现有的代码库,我需要一个全局解决方案。不是在EF5中,而是EF6(当前为alpha版本)允许使用此方法。对于EF5,您需要一些基于反射的自定义约定框架,该框架将通过反射向model builder添加HasColumnType调用-例如,检查(它声称支持可插入约定)。因为EF6已经推出了很长一段

在使用代码优先模型时,是否可以全局设置实体框架
DbContext
以对所有
System.DateTime
属性使用
datetime2


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

不是在EF5中,而是EF6(当前为alpha版本)允许使用此方法。对于EF5,您需要一些基于反射的自定义约定框架,该框架将通过反射向model builder添加
HasColumnType
调用-例如,检查(它声称支持可插入约定)。

因为EF6已经推出了很长一段时间,而且这个问题仍然出现在搜索中,下面是使用自定义约定设置SQL类型的方法。在DbContext类的OnModelCreating方法中,执行以下操作:

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

只是好奇你为什么要这么做。我问这个问题的原因是,当尝试提交一个具有不可为空的DateTime列(DateTime.MinVal)的默认值的实体时,这是一个非常常见的错误。例外情况表明您应该使用DateTime2列,但这通常是误导性的,除非您确实需要额外的精度。修复方法是为DateTime字段指定一个非默认值,或者将其定义为可为空。希望这对我们有所帮助。@w.brian 1)我们有一个存储艺术作品和作者的表格,在1753年之前两者都可以制作/出生。。。2) 如果这是可能的,它将是其他每个字段的最小日期验证的替代方案。3) 技术好奇心…明白了。只是想确保你没有像我最初遇到上面提到的异常时那样出错。@w.brian,即使错误是因为
DateTime.MinVal
强制
DateTime2
也是合理的。引用MSDN:
为新工作使用时间、日期、日期时间2和日期时间偏移数据类型。
@w.brian再也没有理由使用日期时间了。datetime2允许更大的日期范围,更精确,如果选择的精度较低,则使用更少的存储空间。所述错误不是切换的唯一原因。这仅适用于新模式吗?因为我在更新数据库时收到此错误消息:ALTER TABLE ALTER COLUMN Date失败,因为一个或多个对象访问此列。@Jacob您的意思是,如果您已经为模型创建了数据库,它会工作吗?是的,但是您必须记住在将约定添加到OnModelCreating之后创建迁移。我就是这样做的,所以我知道如果做对了,它会工作:)我的错误是由于表约束造成的。我根据这个答案手动删除了它们,解决了这个问题:不过,你的答案对我们帮助很大。我们根据您发布的代码迁移了整个数据库。非常感谢。