Обновление модели из базы данных обновляет базу данных вместо - PullRequest
2 голосов
/ 18 июня 2019

У меня есть файл Entity Framework .edmx , в котором одна из моделей основана на представлении экземпляра SQL Server в Azure. Я изменяю это представление так, чтобы оно включало один дополнительный столбец.

В SQL Server Management Studio оператор ALTER успешно выполняется без инцидентов. После этого SELECT * FROM theView показывает новый столбец, как и ожидалось.

Обращаясь к решению в Visual Studio, я открываю файл .edmx , чтобы отобразить область разработки для моделей. Затем я щелкаю правой кнопкой мыши и выбираю Обновить модель из базы данных . Мне показывают мастер обновления и переключаются на вкладку Обновить . Многие виды отображаются на вкладке. Это относится и к недавно измененному.

Update Wizard: Refresh tab

Я нажимаю Готово и через несколько секунд мастер завершает работу. Однако представление в базе данных больше не имеет дополнительного поля, что подтверждается выполнением приведенного выше оператора SELECT и просмотром его структуры в режиме «Дизайн». Неожиданно, но в соответствии с отсутствующим столбцом, мое решение сталкивается с этой ошибкой при попытке вернуть соответствующий DbSet:

System.Data.SqlClient.SqlException: неверное имя столбца

Я прочитал несколько связанных статей, которые предполагают, что есть проблемы, а также причуды к функции Update Models from Database:

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

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


ОБНОВЛЕНИЕ [2019-06-19] : Хотя комментатор, который спросил об этом, пересмотрел это как возможную красную сельдь, я упомяну это для полноты картины. OnModelCreating для контекста выглядит следующим образом (по умолчанию):

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }
...