Как обновить entity framework

Обновлено: 04.07.2024

Я просматривал исходный код Entity Framework и нашел способ действительно обновить сущность, если вы знаете свойство Key:

В противном случае проверьте реализацию AddOrUpdate для идей.

Надеюсь, это поможет!

Вы можете использовать метод AddOrUpdate :

Параллельность всегда сложна, но я предполагаю, что вы просто хотите, чтобы ваши обновления выигрывали. Вот как я сделал это для моего же случая и изменил имена, чтобы имитировать ваши классы. Другими словами, просто измените attach чтобы add , и это работает для меня:

Этот код является результатом теста для обновления только набора столбцов без выполнения запроса на возврат записи в первую очередь. Сначала он использует код Entity Framework 7.

Вы должны использовать. Entry(), если вы хотите обновить все поля вашего объекта.
Также имейте в виду, что вы не можете изменить идентификатор поля (key), поэтому сначала задайте Id для некоторых при редактировании.

Вот лучшее решение для этой проблемы: В представлении добавьте все ID (Ключи). Рассмотрим несколько таблиц с именем (первый, второй и третий)

Вы должны удалить db.Books.Attach(book);

Я нашел способ, который работает просто отлично.

Attach объекта установит для его состояния отслеживания значение Unchanged . Чтобы обновить существующую сущность, все, что вам нужно сделать, это установить состояние отслеживания на Modified . Согласно документам EF6:

Если у вас есть объект, который, как вы знаете, уже существует в базе данных, но в который, возможно, были внесены изменения, вы можете указать контексту присоединить объект и установить для него состояние Modified. Например:

Здесь мой метод обновления сущности RIA (для временного интервала Ef6):

Как сказал Ренат, удалите: db.Books.Attach(book);

Это если для Entity Framework 6.2.0.

Если у вас есть определенный DbSet и элемент, который необходимо либо обновить, либо создать:

Однако это также может быть использовано для универсального DbSet с одним первичным ключом или составным первичным ключом.

Я знаю, что на это уже отвечали несколько раз, но мне нравится ниже способ сделать это. Надеюсь, это кому-нибудь поможет.

Отличное и простое решение. Перейдите по ссылке для обновления данных в EntityFramework.

Это должно быть простым для приложений, которые используют DbContext как поставляемые в EF 4,1 и более поздних версиях. Для приложений, использующих контекст ObjectContext, требуется немного больше работы, но это не так уж сложно.

Ниже приведен контрольный список действий, которые необходимо выполнить для обновления существующего приложения до EF6.

1. установка пакета NuGet EF6

Необходимо выполнить обновление до новой среды выполнения Entity Framework 6.

  1. щелкните проект правой кнопкой мыши и выберите пункт управление NuGet пакетами.
  2. На вкладке "в сети " выберите EntityFramework и нажмите кнопку " установить ".

если была установлена предыдущая версия пакета NuGet EntityFramework, обновит ее до EF6.

кроме того, можно выполнить следующую команду из консоли диспетчер пакетов:

2. Убедитесь, что удалены ссылки на System.Data.Entity.dll сборки

при установке пакета NuGet EF6 необходимо автоматически удалить все ссылки на System. Data. Entity из вашего проекта.

3. переключайте любые модели конструктора EF (EDMX) для использования создания кода EF 6. x

При наличии моделей, созданных с помощью конструктора EF, необходимо обновить шаблоны создания кода, чтобы создать совместимый с EF6 код.

в настоящее время доступны шаблоны генератора EF 6. x DbContext для Visual Studio 2012 и 2013.

Удаление существующих шаблонов создания кода. Обычно эти файлы имеют имя edmx_file_name > . TT и > и будьте вложены в файл EDMX в Обозреватель решений. Можно выбрать шаблоны в обозреватель решений и нажать клавишу Del , чтобы удалить их.

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

В проектах VB.NET необходимо включить параметр "Показать все файлы", чтобы иметь возможность просматривать файлы вложенных шаблонов.

Добавьте соответствующий шаблон создания кода EF 6. x. Откройте модель в конструкторе EF, щелкните правой кнопкой мыши область конструктора и выберите пункт Добавить элемент создания кода.

Если вы используете API DbContext (рекомендуется), то на вкладке " данные " будет доступен генератор DbContext EF 6. x .

при использовании Visual Studio 2012 необходимо установить средства EF 6 для этого шаблона. Дополнительные сведения см. в разделе получение Entity Framework .

Если вы используете интерфейс ObjectContext API, необходимо выбрать вкладку "в сети " и найти генератор EntityObject EF 6. x.

Если вы применили какие-либо настройки к шаблонам создания кода, потребуется повторно применить их к обновленным шаблонам.

4. Обновите пространства имен для всех используемых основных типов EF.

пространства имен для типов DbContext и Code First не изменились. Это означает, что для многих приложений, использующих EF 4,1 или более поздней версии, не нужно ничего менять.

Такие типы, как ObjectContext, ранее находились в System.Data.Entity.dll, были перемещены в новые пространства имен. Это означает, что может потребоваться обновить директивы using или Import для создания EF6.

Общее правило изменения пространства имен заключается в том, что любой тип в System. Data. * перемещается в System. Data. Entity. Core. *. Иными словами, просто вставьте сущность. Core. после System. Data. Пример:

  • System. Data. Ентитексцептион = > System. Data.>. ентитексцептион
  • System. Data. objects. ObjectContext = > System. Data.>. Objects. ObjectContext
  • Класс System. Data. objects. AMO. RelationshipManager = > System. Data.>. Objects. coclass. RelationshipManager

Эти типы находятся в основных пространствах имен, так как они не используются напрямую для большинства приложений на основе DbContext. Некоторые типы, которые были частью System.Data.Entity.dll, по-прежнему используются как обычно, так и напрямую для приложений на основе DbContext и поэтому не были перемещены в основные пространства имен. А именно:

  • System. Data. EntityState = > System. Data.>. EntityState
  • Класс System. Data. objects. AMO. Едмфунктионаттрибуте = > System. Data.>

Этот класс был переименован; класс с прежним именем по-прежнему существует и работает, но теперь помечен как устаревший.

Этот класс был переименован; класс с прежним именем по-прежнему существует и работает, но теперь помечен как устаревший.)

Если вы создаете файл edmx из базы данных, а затем изменения в БД, как вы получаете модель, чтобы забрать изменения?

вы удаляете всю модель и регенерируете или можете обнаружить изменения?

Я только начинаю.

щелкните правой кнопкой мыши на поверхности конструктора edmx designer и выберите Update Model From Database.

все сущности обновляются по умолчанию, новые сущности добавляются только при их выборе.

изменить: Если это не освежает хорошо.

  • выберите Все таблицы и представления в EDMX дизайнер.
  • удалить их.
  • затем обновить модель из базы данных

Я нашел, что дизайнер "обновление из базы данных" может обрабатывать только небольшие изменения. Если вы удалили таблицы, изменили внешние ключи или (gasp) изменили подпись хранимой процедуры с сопоставлением функций, вы в конечном итоге получите такое запутанное состояние, что вам придется либо удалить все сущности и "добавить из базы данных", либо просто удалить ресурс edmx и начать все сначала.

Это может помочь вам, ребята.(Я применил это к своим проектам)

вот 3 простых шага.

обновление модели CodeFirst невозможно автоматически. Я тоже не рекомендую. Потому что одним из преимуществ кода во-первых, вы можете работать с классами POCO. Если вы изменили эти классы POCO, вы не хотите, чтобы какой-то автоматически сгенерированный код уничтожил вашу работу.

но вы можете создать некоторое шаблонное решение, добавьте обновленную / добавленную сущность в новую модель. затем соберите и переместите новый cs-файл в рабочий проект. таким образом, у вас не будет конфликта, если это новая сущность, которую вы можно просто добавить связанный cs-файл в существующий проект. если это обновление, просто добавьте новое свойство из файла. Если вы просто добавляете несколько столбцов в одну или две таблицы, вы можете вручную добавить их в свой класс POCO, вам не нужны дополнительные работы, и в этом красота работы с классами Code-First и POCO.

Мне просто нужно было обновить .модель edmx. Опция model / Run Custom Tool не обновляла поля для меня, но как только я открыл графический дизайнер, я смог вручную переименовать поля.

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

Он работает на моей Visual Studio 2015!

  1. удалите таблицы из конструктора EDMX
  2. Rebuild Project / SLN (это очистит класс модели)
  3. обновить модель из базы данных (readd все таблицы, которые вы хотите)
  4. Rebuild project / SLN (это воссоздаст ваш класс модели, включая новые столбцы)

Я работал над проектом, не слишком большим, который включает Entity Framework, около десятка таблиц и около 15 хранимых процессов и функций. После нескольких недель разработки попытка обновить мои таблицы и сохраненные процессы дала неоднозначные результаты, поскольку успешно обновила модель. Иногда изменения эффективны, в большинстве случаев-нет. Простые изменения столбцов (изменение порядка, добавление, удаление или переименование) иногда работает, чаще нет. Кажется, что Visual Studio есть больше проблем с обновлением, чем просто добавление нового. Он также показывает больше проблем с сохраненными изменениями proc, не отраженными, особенно когда столбцы добавляются или удаляются или переименовываются. Я не обнаружил никакого последовательного поведения, поэтому я не могу сказать: "этот тип изменений всегда будет обновляться, а этот тип изменений не будет".

clip_image001
clip_image002
clip_image003

При создании новой сущности курса, она должна быть связана с существующим факультетом. Чтобы обеспечить это, сгенерированный код включает в себя метода контроллера и представления Create и Edit с выпадающими списками для выделения факультета. Выпадающий список определяет свойство внешнего ключа Course.DepartmentID, всё, что нужно EF для загрузки Department navigation property соответствующими сущностями Department. Вы будете использовать сгенерированный код с небольшими изменениями для обработки ошибок и сортировки элементов выпадающего списка.

В CourseController.cs замените код методов Edit и Create:


Метод PopulateDepartmentsDropDownList загружает список всех факультетов, отсортированный по названию, создаёт коллекцию SelectList для выпадающего списка и передаёт коллекцию в представление в свойство ViewBag. Метод принимает параметр, позволяющий вызывающему опционально определить элемент, выбранный по умолчанию.

В Views\Course\Create.cshtml добавьте новое поле перед полем Title для ввода пользователем номера курса. Ранее объяснялось, что свойства первичных ключей не генерируются на представлении, но в данном случае первичный ключ несёт в себе смысл, поэтому необходимо дать пользователю возможность ввести его значение.


В Views\Course\Edit.cshtml, Views\Course\Delete.cshtml, и Views\Course\Details.cshtml, добавьте новое поле перед полем Title для отображения номера курса. Поскольку это первичный ключ, он должен быть отображён, но редактирование должно быть запрещено.


Запустите проект и перейдите на страницу Create и введите данные для нового курса:

clip_image001[1]

Нажмите Create. Отобразится страница Course Index со списком с добавленным курсом. Название факультета будет взято из navigation property, таким образом будет удостоверено, что связь между сущностями установлена корректно.

clip_image004

Откройте страницу Edit (откройте страницу Course Index и нажмите Edit на курсе).

clip_image002[1]

Измените данные и нажмите Save. Отобразится страница Course Index с обновлёнными данными о курсе.

Добавление страницы Edit для Instructors

  • Если пользователь удалит привязку к офису, необходимо удалить сущность OfficeAssignment.
  • Если пользователь введёт некорректное значение в свойство офиса, необходимо создать новую сущность OfficeAssignment.
  • Если пользователь изменит значение записи об офисе, необходимо изменить значение соответствующей сущности OfficeAssignment.


Сгенерированный код нам не подходит – он инициализирует данные для выпадающего списка, но нам необходимо текстовое поле, поэтому замените данный код на:


В этом коде не используется ViewBag и определяется eager loading для связанных сущностей OfficeAssignment и Course. (Courses понадобится позже.) Для метода Find нельзя определить eager loading, поэтому вместо него для выбора преподавателя используются методы Where и Single.

  • Возвращает сущность Instructor из базы данных используя eager loading для OfficeAssignment и Courses navigation properties. То же самое делали для метода HttpGet Edit.
  • Обновляет сущность Instructor исключая Courses navigation property:
    If (TryUpdateModel(instructorToUpdate, "", null, new string[] < "Courses" >))
    Если проверка не прошла, TryUpdateModel возвращает false, и выполнение переходит на return View.
  • Если запись об офисе пуста, свойство Instructor.OfficeAssignment устанавливаается в null, таким образом таблица OfficeAssignment будет удалена.


Выберите вкладку Instructors и нажмите Edit на преподавателе.

clip_image005

Измените значение OfficeLocation и нажмите Save.

clip_image006

На странице Index появится новый адрес, и можно будет увидеть запись в таблице при открытии таблицы OfficeAssignment в ServerExplorer.

clip_image007

clip_image008

На странице Edit введите новое значение в OfficeLocation и нажмите Save. На странице Index появится новое значение адреса, и ServerExplorer отобразит появление новой записи.

clip_image009

Добавление Course Assignments на страницу Instructor Edit

Преподаватели могут вести неограниченное количество курсов. Вы обновите страницу Instructor Edit путём добавления возможности назначения на курс:

clip_image003[1]

Связь между Course и Instructor определена как многие-ко-многим, поэтому доступа к объединённой таблице или внешним ключам нет. Вместо этого небходимо оперировать Instructor.Courses navigation property.

Интерфейс, обеспечивающий возможность изменения привязки курсов к преподавателям, заключен в группе check boxes.

Для передачи данных в представление для генерации группы check boxes необходимо использовать класс модели представления. Создайте AssignedCourseData.cs в папке ViewModels со следующим содержимым:


Код нового метода загружает все сущности Course для создания списка курсов. Для каждого курса происходит проверка на существование в instructor's Courses navigation property. Чтобы эффективно узнать, связан ли курс с преподавателем, курсы, связанные с преподавателем, помещаются в коллекцию HashSet. Свойство курсов Assigned для назначенных курсов устанавливается в true. Представление использует это свойство для определения, отмечать ли check box или нет. После этого, список передаётся в свойстве ViewBag в представление.


Если нет выбранных check boxes, код в UpdateInstructorCourses инициализирует Courses navigation property пустой коллекцией:


Код перебирает все записи курсов в базе данных и, если check box для курса отмечен, но курса нет в Instructor.Courses navigation property, курс добавляется в коллекцию в navigation property.


Если курс не выбран, но курс есть в Instructor.Courses navigation property, то запись о нём удаляется из navigation property.


В Views\Instructor\Edit.cshtml добавьте поле Courses с группой check boxes сразу после контейнеров div для OfficeAssignment:


Код создаёт HTML-таблицу из трёх столбцов, в каждом из которых находится check box с заголовком из номера курса и названия. Все check boxes имеют одинаковое имя (“selectedCourses”), что символизирует их принадлежность к одному группе. Атрибут value каждого check box установлен в значение CourseID. Когда страница отправляет данные, в контроллер передаётся массив, состоящий из выделенных check boxes и значений CourseID.

Когда генерируются check boxes, те, что уже назначены преподавателю, имеют атрибут checked.

После изменения привязки курса к преподавателю нужно проверить изменения при возвращении к странице Index. Для этого надо добавить столбец в таблицу на этой странице. Для этого необязательно использовать объект ViewBag, потому что информация, которую необходимо отобразить, уже находится в Courses navigation property сущности Instructor, которая передаётся в представление в качестве модели.

В Views\Instructor\Index.cshtml добавьте заголовочную ячейку <th>Courses</th> сразу после <th>Office</th>:


После этого добавьте новую ячейку сразу после ячейки с адресом офиса:


Запустите проект и перейдите на страницу InstructorIndex:

clip_image010

Нажмите Edit на преподавателе.

clip_image003[2]

Измените привязку курсов и нажмите Save. Изменения будут видны на странице Index.

Урок-введение в работу сданными закончен. Вы завершили работу над простыми операциями CRUD, но не имели дело с вопросами параллелизма. Следующий урок будет посвящен теме параллелизма, вопросам работы с ним.

Читайте также: