Я имел эту проблему в прошлом, как Entity Framework стандарт для DateTime этого поля Datetime2, то, очевидно, обходной путь, чтобы обновить все столбцы в datetime2 в базе данных SQL Server, однако datetime2 типа данных был только в SQL Server 2008, так что вот несколько вещей, которые можно попробовать:
Во-первых: убедитесь, что , если поле DateTime в вашей базе данных SQL имеет значение NULL, ваша модель использует «DateTime?». (nullable datetime) вместо «DateTime».
Во-вторых: откройте свой файл EDMX любым редактором XML (Visual Studio должен работать) и измените значение вашего ProviderManifestToken
на ProviderManifestToken="2005"
, это должно обеспечить совместимость с SQL Server 2005.
Это работает с .edmx-файлами, но с изменением кода First будет немного сложнее и будет зависеть от вашей версии Framework Entity Framework, поэтому 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
{
}
(источник: How to configure ProviderManifestToken for EF Code First)
E .F. 5 и старше: прочитайте этот пост, который легко прояснит его: http://blog.oneunicorn.com/2012/04/21/code-first-building-blocks/
Надеюсь, что это поможет.
Следует отметить, что редактирование файла 'edmx' напрямую будет перезаписано при следующей проверке модели. Так что это не должно быть использовано. Мне нравится подход использования 'DbConfiguration' – Hopeless
Это выглядит многообещающим. К сожалению, пользовательский класс DbConfiguration, кажется, полностью игнорируется. Я использую EF 6.1.3 –
Дэвид, вы попробовали указать тип столбца в методе OnModelCreating? –