我曾经遇到过这个问题,因为Entity Framework标准的DateTime是DateTime2字段。解决方法是将SQL Server数据库中的所有列更新为datetime2,但是datetime2数据类型仅在SQL Server 2008中引入,所以有几个尝试方法:
第一步:确保你的SQL数据库中的DateTime字段可以为空,如果是,则使用"DateTime?"(可空的日期时间)而不是"DateTime"。
第二步:用任何XML编辑器(Visual Studio应该可以)打开EDMX文件,并将ProviderManifestToken
的值更改为ProviderManifestToken="2005"
,这应该确保与SQL Server 2005兼容。
这适用于.edmx文件,但对于Code First,更改会更具挑战性,并且取决于您的Entity Framework版本,因此Microsoft建议尝试在OnModelCreating方法中指定列类型,例如以下示例:
modelBuilder.Entity<Blog>().Property(t => t.CreatedOn).HasColumnName("CreatedOn").HasColumnType("date");
尝试通过改变ColumnType的值来达到你的目标。
如果你仍然想要更改你的ProviderManifestToken
值:
E.F. 6: 你可以为你的DbContext创建一个配置,基本上是这样的一个类:
internal sealed class EntityFrameworkDbConfiguration : DbConfiguration
{
private const string SqlServerManifestToken = @"2005";
public EntityFrameworkDbConfiguration()
{
this.AddDependencyResolver(new SingletonDependencyResolver<IManifestTokenResolver>(new ManifestTokenService()));
}
private sealed class ManifestTokenService : IManifestTokenResolver
{
private static readonly IManifestTokenResolver DefaultManifestTokenResolver = new DefaultManifestTokenResolver();
public string ResolveManifestToken(DbConnection connection)
{
if (connection is SqlConnection)
{
return SqlServerManifestToken;
}
return DefaultManifestTokenResolver.ResolveManifestToken(connection);
}
}
}
使用方法:
DbConfigurationType(typeof(EntityFrameworkDbConfiguration))]
public class MyContextContext : DbContext
{
}
(来源:
如何配置 EF Code First 的 ProviderManifestToken)
E.F. 5 及更早版本:阅读这篇文章可以很容易地澄清:
http://blog.oneunicorn.com/2012/04/21/code-first-building-blocks/
希望对您有所帮助。
edmx
文件将在下次验证模型时被覆盖。因此不应该使用这种方法。我喜欢使用DbConfiguration
的方式。 - Hopeless