EF Code Первое изменение типа данных bool? для bool и int? к внутреннему

У нас есть приложение, в котором мы используем автоматическую миграцию данных, и потеря данных не допускается. Согласно политике компании, мне не разрешено изменять эти настройки.

У нас также есть несколько столбцов с нулевым значением в нескольких таблицах bool? тип и интервал? тип.

Я только что обнаружил сегодня, что есть фрагмент кода, который просматривает существующие записи базы данных и устанавливает значения столбцов, допускающих значение NULL, в их значения по умолчанию (false и 0 соответственно). Текущее поведение замедляет работу приложения. Я хочу заставить базу данных/EF устанавливать значения по умолчанию и не допускать пустых значений.

До сих пор я безуспешно пробовал следующее:

  1. Прямое изменение типа с bool? для bool и int? в внутр. Выдает исключение потери данных.
  2. Добавление атрибутов [Required] и [DefaultValue(false)] поверх свойства, допускающего значение NULL. То же самое, исключение потери данных.
  3. Изменение .IsOptional() на .IsRequired() в классе сопоставления также вызвало такое же исключение.

По сути, я хочу воспроизвести в Code First EF следующий оператор MySQL:

ALTER TABLE orders 
CHANGE COLUMN ScaleToFit ScaleToFit TINYINT(1) NOT NULL DEFAULT 0;

Есть ли изящные решения проблемы с политикой компании? Спасибо!

вы пробовали только атрибут DefaultValue (без атрибута Required)?

Matt.G 28.02.2019 21:54

@ Matt.G только что попробовал. Установка DefaultValue сама по себе ничего не делает с уже существующими нулевыми значениями. Думаю, это повлияет только на будущие записи.

Marina Melin 28.02.2019 22:12

не уверен, что вы можете сделать что-нибудь для существующих данных в базе данных. Что происходит, когда вы пытаетесь получить эти данные в коде с атрибутом DefaultValue? возвращает false или null?

Matt.G 28.02.2019 22:17

@Matt.G возвращает ноль

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

Ответы 1

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

Это может быть мой первый ответ, не связанный с программированием.

Я искренне надеюсь, что не существует элегантного решения — и вообще никакого решения — для достижения этого с помощью миграции. Это означало бы утечку в обнаружении потери данных, что было бы плохой новостью. Это считается потерей данных, потому что значение null может также нести информацию, т. е. преднамеренное «не знаю». В случае логического значения: три состояния превращаются в два состояния. Это неверно в вашем случае, отсюда и этот процесс исправления, но это не меняет правила.

By company's policy, I am not allowed to change those settings.

Политики обслуживать цель, но почти всегда цель превратиться в. Вероятно, потому, что политики легче определить, внедрить и проверить, чем их основное назначение. Но как в Закон Гудхарта...

When a measure becomes a target, it ceases to be a good measure

... каждая политика может однажды разрушить свою цель и перестать быть хорошей политикой. Способность признавать это и изменять политику, когда это необходимо, является похвальной чертой организаций.

Я пытаюсь сказать: предложите временную однократную приостановку этой политики, чтобы разрешить миграцию, при которой Только применяет эти необнуляемые поля со значениями по умолчанию. Если нулевые значения действительно бессмысленны и на самом деле должны были быть не нулевыми с самого начала, это самый простой способ добраться туда, куда вы хотите.

Я также предложил правильно обрабатывать нули в коде, вместо того, чтобы ожидать ненулевые значения. Однако это потребует больше изменений, чем пользовательская миграция.

Marina Melin 01.03.2019 20:47

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