В нашем случае было непрактично всегда указывать DateTimeKind, как указано ранее:
DateTime utcDateTime = DateTime.SpecifyKind(databaseDateTime, DateTimeKind.Utc);
Если вы хотите, чтобы все объекты DateTime, выходящие из базы данных, были указаны как UTC, вам нужно добавить файл преобразования T4 и добавить дополнительную логику для всех объектов DateTime и DateTime, допускающих значение NULL, чтобы они инициализировались как DateTimeKind.Utc.
У меня есть сообщение в блоге, в котором это объясняется шаг за шагом: http://www.aaroncoleman.net/post/2011/06/16/Forcing-Entity-Framework-to-mark-DateTime-fields-at-UTC.aspx а>
Короче:
1) Создайте файл .tt для вашей модели .edmx.
2) Откройте файл .tt и найдите метод «WritePrimitiveTypeProperty».
3) Замените существующий код установки. Это все между обратными вызовами метода ReportPropertyChanging и ReportPropertyChanged со следующим:
<#+ if( ((PrimitiveType)primitiveProperty.TypeUsage.EdmType).PrimitiveTypeKind == PrimitiveTypeKind.DateTime)
{
#>
if(<#=code.FieldName(primitiveProperty)#> == new DateTime())
{
<#=code.FieldName(primitiveProperty)#> = StructuralObject.SetValidValue(value<#=OptionalNullableParameterForSetValidValue(primitiveProperty, code)#>);
<#+
if(ef.IsNullable(primitiveProperty))
{
#>
if(value != null)
<#=code.FieldName(primitiveProperty)#> = DateTime.SpecifyKind(<#=code.FieldName(primitiveProperty)#>.Value, DateTimeKind.Utc);
<#+ }
else
{#>
<#=code.FieldName(primitiveProperty)#> = DateTime.SpecifyKind(<#=code.FieldName(primitiveProperty)#>, DateTimeKind.Utc);
<#+
}
#>
}
else
{
<#=code.FieldName(primitiveProperty)#> = StructuralObject.SetValidValue(value<#=OptionalNullableParameterForSetValidValue(primitiveProperty, code)#>);
}
<#+
}
else
{
#>
<#=code.FieldName(primitiveProperty)#> = StructuralObject.SetValidValue(value<#=OptionalNullableParameterForSetValidValue(primitiveProperty, code)#>);
<#+
}
#>
person
aarondcoleman
schedule
16.06.2011