Npgsql EF 6: не удается вставить значение даты и времени в формате UTC, хотя базовый столбец имеет тип timestampTz

Недавно я обновил свое приложение до: Vs 2019, EntityFramework.6.4.4, EntityFramework6.Npgsql.6.4.3 и Npgsql.6.0.4.

Раньше все работало хорошо. После обновления я протестировал различные варианты использования при вставке и чтении в базу данных и из нее (postgreSql V13).

При вставке простого объекта со значением timestampTz я получил следующее исключение:

Cannot write DateTime with Kind=UTC to PostgreSQL type 'timestamp without time zone', consider using 'timestamp with time zone'. Note that it's not possible to mix DateTimes with different Kinds in an array/range. See the Npgsql.EnableLegacyTimestampBehavior AppContext switch to enable legacy behavior.

Вот фрагменты кода, которые я использую. Класс сущности (POCO):

    [DataContract]
    [Table("TSHH_ShiftHistory", Schema = "ppc")]
    public class TSHH_ShiftHistory
    {
        [DataMember]
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int SHH_RecordingOrder { get; set; }
        //..
        [DataMember]
        public DateTime? SHH_Started_UTC { get; set; }
        [DataMember]
        public DateTime? SHH_Finished_UTC { get; set; }
        // .. 
    }

И записываем в базу:

    shiftHistory = new TSHH_ShiftHistory();
    shiftHistory.SHH_Started_UTC = dateTimeStarted; // in UTC format
    shiftHistory.SHH_Finished_UTC = dateTimeFinished; // in UTC format

    db.TSHH_ShiftHistory.Add(shiftHistory);

    int sc = db.SaveChanges();

Вот сайты, где я пытался получить помощь:

https://www.npgsql.org/doc/release-notes/6.0.html#timestamp-rationalization-and-improvementshttps://www.npgsql.org/doc/types/datetime.html#timestamps-and-timezoneshttps://www.npgsql.org/doc/api/NpgsqlTypes.NpgsqlDbType.html

Npgsql EF 6: сбой временной метки при использовании ExecuteSqlInterpolatedAsynchttps://github.com/npgsql/npgsql/issues/2669https://docs.microsoft.com/en-us/ef/core/modeling/value-conversions?tabs=data-annotations#the-valueconverter-class

Решение:

AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);

Конечно, я читал об этом в статьях, но я не видел необходимости возвращаться назад, когда мне нужно новое поведение в отношении метки времени с отображением часового пояса, начиная с npgsql 6.0. Но вот оно. Я экспериментировал с установкой переключателя на истинный и ЛОЖЬ. Удивительно, но исключение не возникло независимо от установленного значения.

По крайней мере, я раскомментировал строку "AppContext.SetSwitch(..);" и исключение возникло снова при вставке значения UTC DateTime.

мой подозреваемый: Интересно, если отсутствующий "AppContext.SetSwitch(..);" оператор не является инициализированным поведением и приводит к непредсказуемому результату.

Я был бы рад, если бы кто-нибудь мог подтвердить мои подозрения, может быть, @Shay Rojansky?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы используете старый (неосновной) EF6, который, скорее всего, также придется настроить, чтобы учесть новое поведение метки времени (определенно это сделал поставщик EF Core). К сожалению, этого не произойдет, поскольку EF6 больше не разрабатывается.

В целом я бы рекомендовал не запускать EF6 с более новыми версиями Npgsql; эти комбинации не проверяются и могут дать сбой по разным причинам. Поскольку EF6 эффективно заморожен, я бы рекомендовал сохранить ту же версию Npgsql.

Спасибо за Ваш быстрый ответ. Я думаю, что я пойду по пути перехода на EF Core, чтобы избежать возможных проблем в будущем.

Wolfram Kulterer 12.05.2022 08:17

Другие вопросы по теме