Есть ли способ, которым я могу дать указание Entity Framework всегда хранить DateTimeOffset в качестве значения UTC. Технически для этого нет оснований, но я предпочитаю, чтобы все данные в моей базе данных были согласованы.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 или других инструментах DB.
РЕДАКТИРОВАТЬ 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 я, наконец, удалось решить эту проблему, см ответ ниже
Возможно, вы хотите сохранить все как UTC + 0?Как вы сможете конвертировать его обратно, когда вам нужно отобразить формат локали пользователей? Учитывайте также изменения в часовом поясе, такие как BST – musefan
@musefan Именно по этой причине сохранение в UTC имеет смысл. Да, вам нужен локальный формат/часовой пояс, но он будет работать в глобальном масштабе, а не только в часовом поясе, где было введено время datetime. – Maarten
Возможный дубликат [Can Entity Framework автоматически конвертирует поля datetime в UTC при сохранении?] (Http://stackoverflow.com/questions/39418323/canentity-framework-automatically-convert-datetime-fields-to-utc-on -save) – Igor