最终编辑/ TLDR :
确实问题与EF无关,但 SQL Server :我在这台特定机器上运行了3个版本: 2005 (不知道从哪里来!), 2008 和 2012 。
由于未知原因, 2005 版本被用作默认版本。
因此我已将其卸载并重新安装2012版本,强制使用正确的默认名称(" SQLEXPRESS" )。
从那时起,我可以强制DateTime
映射到DateTime2
而不会出现任何问题。
我看过一些代码示例使用:
[Column(TypeName = "DateTime2")]
将.Net DateTime
映射到 SQL Server DateTime2
。
但是最新的EF 6.1.1
似乎已经破了。
我调试了源代码,发现确实DateTime2
不在SQL Server支持的类型列表中!
这是一个简单的复制品:
class BrokenDateTime2
{
public long Id { get; set; }
[Column(TypeName = "DateTime2")]
public DateTime DateTime2 { get; set; }
}
class Context : DbContext
{
public DbSet<BrokenDateTime2> BrokenDateTime2 { get; set; }
}
...
using (Context context = new Context())
{
context.Database.Initialize(true);
}
我错过了什么?
编辑:更多代码
爆炸:
public static PrimitiveType GetStoreTypeFromName(this DbProviderManifest providerManifest, string name)
{
...
return providerManifest.GetStoreTypes()
.Single(p => string.Equals(p.Name, name, StringComparison.OrdinalIgnoreCase));
}
确实当我看providerManifest.GetStoreTypes()
时,我看不到任何符合DateTime2
的内容。
例外是:
InvalidOperationException: Sequence contains no matching element
答案 0 :(得分:1)
如果运行SQL Server 2008及更高版本,则实体框架完全支持Datetime2,而不是SQL Server 2005!