В нашем случае было нецелесообразно всегда указывать DateTimeKind, как указано ранее:
DateTime utcDateTime = DateTime.SpecifyKind(databaseDateTime, DateTimeKind.Utc);
Если вы хотите, чтобы все объекты DateTime, выходящие из базы данных, были указаны как UTC, вам нужно добавить файл преобразования T4 и добавить дополнительную логику для всех объектов DateTime и обнуляемого DateTime, чтобы они инициализировались как 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)#>);
<#+
}
#>