Как синхронизировать модель после использования кода First из базы данных с использованием Entity Framework 6.1 и MVC 5?
Предположения
-
Использование EF 6.1, MVC 5, VS 2013, С#
-
У меня есть существующая модель базы данных, разработанная в Toad DM для SQL Server, и очень важно постоянно обновлять ее.
Шаги и заметки
-
Используя модель данных сущности ADO.NET, я выбрал Code First from Database (новая функция в EF 6.1) для генерации моделей. Примечание. Класс классов и класс DbContext успешно сгенерированы, но NO.edmx или .tt был создан.
-
Далее я добавил новый элемент эстакады: контроллеры MVC 5 с представлениями, используя Entity Framework. Примечание. Созданные успехи, контроллеры и представления
Вопрос
Отныне я не хочу использовать Code First для обновления моей базы данных. Вместо этого я хочу, чтобы модели обновлялись на основе изменений базы данных. Что делать дальше? Если у меня нет файла edmx, я не смогу обновить классы модели из базы данных?
Ответы
Ответ 1
Код мастера модели данных сущности Сначала из базы данных выполняется отличная работа, создающая классы сущностей, как если бы они были созданы в стиле Code First. Вы спрашиваете, есть ли способ обновить эти классы по мере изменения вашей базы данных, аналогично стилю EDMX "Обновить модель из базы данных". Из того, что я исследовал, это невозможно с помощью встроенного инструментария. Тем не менее, вот одно обходное решение, которое я нашел полезным:
Скажем, у меня есть база данных с таблицей продуктов и таблицей клиентов. Первоначально я создал класс StoreDBContext и выбрал продукт как один из моих объектов. Теперь я хочу добавить таблицу клиента в качестве нового объекта в существующий контекст. Здесь, как это сделать с помощью мастера Code First Wizard:
- Создайте новую модель данных сущностей, вызовите ее StoreDBContextTemp или что угодно
![Добавить новый элемент]()
- Выберите сначала код из мастера базы данных
![сначала код из базы данных]()
- Выберите клиента как объект для добавления (только клиент) и заполните мастер
![добавить таблицу]()
- Откройте вновь созданный файл контекста,
StoreDBContextTemp.cs
и скопируйте виртуальные свойства новых добавленных объектов:
public virtual DbSet<Customer> Customers {get; set;}
- Вставьте эти новые свойства в свой исходный класс
StoreDBContext.cs
dbcontext.
- Удалить StoreDBContextTemp.cs и удалить строку подключения для StoreDBContextTemp в app.config/web.confg и т.д.
- Теперь вы можете использовать Customer в классе StoreDBContext
Если вы добавляете или удаляете таблицы, вам нужно вручную настраивать поля, но по крайней мере вам не придется вручную писать десятки свойств каждый раз, когда новая таблица добавляется в модель.
Ответ 2
Три вещи.
-
Нет .edmx, когда вы используете Code First.
-
Если вы используете First First Migrations, вам придется сначала написать код и после этого перенести изменения в базу данных. Это поможет вам организовать гораздо более организованный код без сгенерированного кода, который является преимуществом.
-
В Visual Studio есть плагин для противоположного. Entity Framework PowerTools позволяет вам выбирать базу данных и сопоставлять ее с объектами.
https://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d
Ответ 3
Есть еще одна вещь, чтобы добавить ответ Брайана Вандера Плааса. На шаге 4 вы также захотите скопировать все, что находится в новом методе StoreDBContextTemp.cs/OnModelCreating, и добавить его в существующий StoreDBContext.cs/OnModelCreating. В противном случае вы потеряете эти дополнения конфигурации при удалении нового класса контекста.
Ответ 4
Еще один вариант - просто удалить автоматически созданные классы из проекта и снова создать их.
Если следовать этому подходу только для того, чтобы убедиться, что мы должны указывать одно и то же имя для модели данных (имя класса, которое наследуется от DbContext), как предыдущее. Название модели модели подсвечено ниже.
![Имя модели данных]()