Есть ли способ, которым я могу указать Entity Framework всегда хранить DateTimeOffset как значение UTC. Технически для этого нет причин, но я предпочитаю, чтобы все данные в моей базе данных были согласованы.
В настоящее время он сохраняет DateTimeOffset, полученный от клиента, который может быть любым в зависимости от языкового стандарта пользователя.
Я думал о том, чтобы, возможно, перехватить весь метод SaveChanges, прокручивать изменения, искать типы DateTimeOffset и выполнять преобразование явно, но это похоже на большую работу, которую можно было бы смягчить, если бы в EntityFramework было что-то встроенное.
Мы будем очень признательны за любые идеи или предложения.
EDIT: Разница между моим сообщением и другими, посвященными этой теме, заключается в том, что мое свойство C# имеет тип DateTimeOffset, а поле моей базы данных также имеет значение DateTimeOffset(0). Нет никаких технических причин для преобразования, кроме согласованности. Если я сохраняю значение как «17:00 +5:00» или «10:00 -2:00», это не имеет значения, это одинаковые моменты времени. Однако я хотел бы, чтобы все мои даты сохранялись как «12:00 +0:00», чтобы их было легче читать в SSMS или других инструментах БД.
РЕДАКТИРОВАТЬ 2: Видя, что не существует "простого" способа сделать это, я теперь пытаюсь решить проблему в функции DbContext.SaveChanges(). Проблема в том, что независимо от того, что я делаю, значение не изменится? Вот код на данный момент:
public new void SaveChanges()
{
foreach (var entry in this.ChangeTracker.Entries())
{
foreach (var propertyInfo in entry.Entity.GetType().GetProperties().Where(p => p.CanWrite && p.PropertyType == typeof(DateTimeOffset)))
{
var value = entry.CurrentValues.GetValue<DateTimeOffset>(propertyInfo.Name);
var universalTime = value.ToUniversalTime();
entry.CurrentValues[propertyInfo.Name] = universalTime;
// entry.Property(propertyInfo.Name).CurrentValue = universalTime;
// Adding a watch to "entry.CurrentValues[propertyInfo.Name]" reveals that it has not changed??
}
// TODO: DateTimeOffset?
}
base.SaveChanges();
}
EDIT 3 Мне наконец удалось решить эту проблему, см. ответ ниже
datetimeoffset
. Почему вы думаете, что вам нужно преобразовать значение и потерять исходную информацию о смещении? Здесь нет согласованности, которую нужно поддерживать, просто потеря данных. - person Panagiotis Kanavos   schedule 11.10.2016propertyInfo.SetValue(entry.Entity, universalTime)
)?. Я не думаю, что когда-либо пытался калечитьCurrentValues
- person Jcl   schedule 11.10.2016datetimeoffset
, если тогда вы отбросите смещение? Кроме того, с точки зрения человека/разработчика то, что волшебным образом меняет значения и отбрасывает данные, не приветствуется. Гораздо чище изменить смещение при установке свойства, а не за кулисами. - person Panagiotis Kanavos   schedule 11.10.2016DateTimeOffset
в часовом поясе UTC, кроме того, что это выглядит красивее в SSMS. Если вам нужно показать их в определенном часовом поясе, конвертируйте их для отображения (в вашем приложении), а не для хранения. - person Jcl   schedule 11.10.2016datetimeoffset
в SQL Server всегда сохраняется, индексируется и сравнивается в формате UTC. Смещение предназначено только для извлечения (чтобы вы знали, в какое время были введены данные). Сравнения всегда производятся в формате UTC. - person Jcl   schedule 11.10.2016The data is stored in the database and processed, compared, sorted, and indexed in the server as in UTC. The time zone offset will be preserved in the database for retrieval.
. В принципе, это не имеет значения ни для чего, кроме отображения - person Jcl   schedule 11.10.2016