我过去遇到过这个问题,因为 DateTime 的实体框架标准是 DateTime2 字段,显然的解决方法是将 SQL Server 数据库中的所有列更新为 datetime2,但是 datetime2 数据类型仅在 SQL Server 2008 中引入,所以在这里有几件事可以尝试:
首先:确保如果 SQL 数据库中的 DateTime 字段为 nullable,则您的模型正在使用“DateTime?” (可为空的日期时间)而不是“日期时间”。
第二:使用任何 XML 编辑器(Visual Studio 应该可以)打开您的 EDMX 文件并将您的值更改ProviderManifestToken
为ProviderManifestToken="2005"
,这应该确保 SQL Server 2005 兼容性。
这适用于 .edmx 文件,但使用 Code First 更改将更具挑战性,并且取决于您的实体框架版本,因此 Microsoft 建议尝试在 OnModelCreating 方法中指定您的列类型,如下例所示:
modelBuilder.Entity<Blog>().Property(t => t.CreatedOn).HasColumnName("CreatedOn").HasColumnType("date");
尝试使用 ColumnType 的值,直到达到目标。
如果您仍想更改您的ProviderManifestToken
值:
EF 6:您可以为您的 DbContext 创建配置,基本上是这样的类:
/// <summary>
/// A configuration class for SQL Server that specifies SQL 2005 compatability.
/// </summary>
internal sealed class EntityFrameworkDbConfiguration : DbConfiguration
{
/// <summary>
/// The provider manifest token to use for SQL Server.
/// </summary>
private const string SqlServerManifestToken = @"2005";
/// <summary>
/// Initializes a new instance of the <see cref="EntityFrameworkDbConfiguration"/> class.
/// </summary>
public EntityFrameworkDbConfiguration()
{
this.AddDependencyResolver(new SingletonDependencyResolver<IManifestTokenResolver>(new ManifestTokenService()));
}
/// <inheritdoc />
private sealed class ManifestTokenService : IManifestTokenResolver
{
/// <summary>
/// The default token resolver.
/// </summary>
private static readonly IManifestTokenResolver DefaultManifestTokenResolver = new DefaultManifestTokenResolver();
/// <inheritdoc />
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)
EF 5 及更早版本:阅读这篇文章可以轻松阐明它:http ://blog.oneunicorn.com/2012/04/21/code-first-building-blocks/
希望有帮助。