Добавление нового столбца в существующую таблицу в инфраструктуре Entity
Я добавил новый столбец в таблицу в моей базе данных. Таблица уже определена в существующей модели Entity Framework. Я прошел через большинство пунктов здесь, как это сделать, и это все еще не удается.
Небольшой фон, эта модель сущности не обновляется не менее 3 лет. Поэтому помимо столбца, который я добавляю, я знаю, что в то время было добавлено несколько других столбцов, но они никогда не включались. Я взял на себя проект около 9 месяцев назад и никогда не смог успешно обновить модель.
Первая попытка:
- Открыл модель в Visual Studio
- Щелкните правой кнопкой мыши по фону
- Нажмите "Обновить модель из базы данных..."
- Нажмите на вкладку "Обновить"
- Выбранные таблицы
- Выделил конкретную таблицу
- Нажмите Готово
Результат:
- Классы для десятков таблиц, которые были в моей модели, были удалены.
- Соответствующая таблица не обновлялась
Вторая попытка
- Восстановленный источник
- То же, что и выше, но
- После открытия мастера обновления щелкните по вкладке "Удалить"
- Выбранные таблицы
- Нажмите Готово
- Все таблицы были удалены.
- Сохранена модель EF/закрыта/открыта.
- Вернулся к вкладке "Добавление мастера обновлений"
- Щелкните таблицы
- Ни одна из моих таблиц не отображалась, когда я расширил все
- Установлен флажок на уровне таблиц
Результат
- Ни один из моих таблиц не был добавлен назад, но все, что не было
изначально было добавлено.
Третья попытка
- Восстановлен весь источник
- Удалены два файла .tt
- Открыл мастер обновления
- Нажмите "Добавить для всего"
Результат
- Ничего не было воссоздано, нет .tt файлов или чего-то еще.
Четвертая попытка
- Восстановленный источник
- Удаленная таблица из модели EF.
- Мастер открываемых обновлений
- Нажмите "Добавить таблицы"
Результаты
- Классы для десятков таблиц, которые были в моей модели, были удалены.
- Следующая таблица не была добавлена.
Конечная попытка
- Добавлен объект вручную для моделирования
Результат
- Код компилируется и выполняется, но значения никогда не извлекаются из базы данных или обновлены
Любая помощь или направление, которые могут быть предоставлены, будут высоко оценены, так как я нахожусь в критическом состоянии и должен обновить модель.
Ответы
Ответ 1
"Обновить модель из базы данных" трудно/медленно использовать и подвержено ошибкам. Он генерирует другие вещи, которые вам, вероятно, не нужны/нужны. Поэтому ручное добавление столбца, которое вам нужно, будет работать лучше.
Я предлагаю вам сделать это вне редактора VS, поскольку в зависимости от того, сколько моделей/таблиц он может очень медленно открывать файл в VS.
1. So in Windows Exlorer,right click on the *.edmx file and open with Notepad (or Notepad++/Textpad).
2. Search for the text <EntityType Name="YourTableNameToAddColumn">.
3. Add the property <Property Name="YourNewColumnName" Type="varchar" MaxLength="64" />
4. Search for the text <MappingFragment StoreEntitySet="YourTableNameToAddColumn">
5. Add mapping to the new column <ScalarProperty Name="YourNewColumnName" ColumnName="YourNewColumnName"/>
6. Save the *.edmx file
Ответ 2
В дополнение к ответу alltej выше и отвечая Крису Уолшу, он отвечает, что он получает "Концептуальный участник или свойство" xxxxx ", указанный как часть этого MSL, не существует в MetadataWorkspace". в новой строке свойств Scalar под <
Вы должны убедиться, что вы ищете "Добавить свойство" в TWOstrong > местах в вашем .edmx файле, иначе вы получите ошибку Chris
Ответ 3
Выяснил проблему. Когда я сгенерировал модель, я получил ошибку 113: множественность недействительна в роли. Я не заметил этого среди других ошибок 16307, которые были сгенерированы при неудачном создании. Как только я исправил, что все работает нормально.
Спасибо
Ответ 4
1. В Windows Exlorer щелкните правой кнопкой мыши файл *.edmx и откройте его с помощью Блокнота (или Notepad++/Textpad).
2. Найдите текст <EntityType Name="YourTableNameToAddColumn">
.
<Property Name="YourNewColumnName" Type="varchar" MaxLength="64"/>
свойство <Property Name="YourNewColumnName" Type="varchar" MaxLength="64"/>
.
<EntityType Name="YourTableNameToAddColumn">
текст снова <EntityType Name="YourTableNameToAddColumn">
, есть второй.
5. Добавьте к нему свойство <Property Name="YourNewColumnName" Type="varchar" MaxLength="64"/>
.
6. Поиск текста <MappingFragment StoreEntitySet="YourTableNameToAddColumn">
.
<ScalarProperty Name="YourNewColumnName" ColumnName="YourNewColumnName"/>
отображение в новый столбец <ScalarProperty Name="YourNewColumnName" ColumnName="YourNewColumnName"/>
.
8. Сохраните файл *.edmx
9.После этого обновите модель edmx вашей public string YourNewColumnName { get; set; }
таблицы public string YourNewColumnName { get; set; }
public string YourNewColumnName { get; set; }
Ответ 5
ПРЕДУПРЕЖДЕНИЕ: Если вы не можете удалить свою базу данных, НЕ выполняйте следующие шаги!
Я использую Visual Code (.net 2).
Вот как я это решил:
Сначала удалите свою базу данных:
dotnet ef database drop
Затем удалите все миграции:
dotnet ef migrations remove
Запустите ту же команду, пока не удаляются миграции all!
Добавьте первую миграцию:
dotnet ef migrations add InitialCreate
После выполнения команды, указанной выше, обязательно внесите изменения в новый файл, сгенерированный, возможно, в файл Data/Migrations: timestamp + InitialCreate не файл desing.
Пример изображения:
Добавление нового столбца
После добавления ваших совпадений, и все будет согласовано, сохраните проект и выполните следующую команду:
dotnet ef database update
Если все в порядке, ваш новый столбец будет создан.
Ответ 6
Я только что нашел этот вопрос, когда возникла ситуация, когда я добавил несколько столбцов в таблицу, и мой файл edmx обновился бы очень хорошо; однако генерация кода не запускалась должным образом, поэтому мои файлы .cs не обновлялись. Я щелкнул правой кнопкой мыши по файлу Entities.tt и выбрал "Запустить пользовательский инструмент", который запускает преобразования текста, что исправило его для меня.