Я изучал различные методы редактирования / обновления записи в Entity Framework 5 в среде ASP.NET MVC3, но пока ни один из них не помечает все нужные мне поля. Я объясню почему.
Я нашел три метода, которым я упомяну плюсы и минусы:
Способ 1 - загрузить исходную запись, обновить каждое свойство
var original = db.Users.Find(updatedUser.UserId);
if (original != null)
{
original.BusinessEntityId = updatedUser.BusinessEntityId;
original.Email = updatedUser.Email;
original.EmployeeId = updatedUser.EmployeeId;
original.Forename = updatedUser.Forename;
original.Surname = updatedUser.Surname;
original.Telephone = updatedUser.Telephone;
original.Title = updatedUser.Title;
original.Fax = updatedUser.Fax;
original.ASPNetUserId = updatedUser.ASPNetUserId;
db.SaveChanges();
}
Pros
- Можно указать, какие свойства изменить
- Представления не должны содержать каждое свойство
Cons
- 2 х запросов к базе данных, чтобы загрузить оригинал, а затем обновить его
Способ 2 - загрузить исходную запись, установить измененные значения
var original = db.Users.Find(updatedUser.UserId);
if (original != null)
{
db.Entry(original).CurrentValues.SetValues(updatedUser);
db.SaveChanges();
}
Pros
- Только измененные свойства отправляются в базу данных
Cons
- Представления должны содержать каждое свойство
- 2 х запросов к базе данных, чтобы загрузить оригинал, а затем обновить его
Способ 3 - Присоединить обновленную запись и установить состояние EntityState.Modified
db.Users.Attach(updatedUser);
db.Entry(updatedUser).State = EntityState.Modified;
db.SaveChanges();
Pros
- 1 х запрос к базе данных для обновления
Cons
- Не могу указать какие свойства изменить
- Представления должны содержать каждое свойство
Вопрос
Мой вопрос к вам, ребята; Есть ли чистый способ, которым я могу достичь этого набора целей?
- Можно указать, какие свойства изменить
- Представления не должны содержать каждое свойство (например, пароль!)
- 1 х запрос к базе данных для обновления
Я понимаю, что это довольно незначительная вещь, на которую можно указать, но я могу упустить простое решение этого вопроса. Если не метод один будет преобладать ;-)
c#
asp.net-mvc-3
entity-framework-5
Stokedout
источник
источник
Ответы:
Ты ищешь:
источник
Мне очень нравится принятый ответ. Я считаю, что есть еще один способ приблизиться к этому. Допустим, у вас есть очень короткий список свойств, которые вы не хотели бы включать в представление, поэтому при обновлении сущности они будут опущены. Скажем, эти два поля - Пароль и SSN.
Этот пример позволяет вам по существу оставить свою бизнес-логику в покое после добавления нового поля в таблицу «Пользователи» и в представление.
источник
источник
Я добавил дополнительный метод обновления в свой базовый класс репозитория, который похож на метод обновления, сгенерированный Scaffolding. Вместо того, чтобы устанавливать весь объект как «измененный», он устанавливает набор отдельных свойств. (T является универсальным параметром класса.)
А потом позвонить, например:
Мне нравится одна поездка в базу данных. Вероятно, лучше сделать это с моделями представления, чтобы избежать повторения наборов свойств. Я еще этого не сделал, потому что я не знаю, как избежать переноса сообщений валидации моих валидаторов модели представления в мой доменный проект.
источник
источник
set
часть оператора обновления.Просто добавить в список опций. Вы также можете извлечь объект из базы данных и использовать инструмент автоматического сопоставления, такой как Auto Mapper, для обновления частей записи, которую вы хотите изменить.
источник
В зависимости от вашего варианта применения применяются все вышеперечисленные решения. Вот как я обычно это делаю, однако:
Для серверного кода (например, пакетного процесса) я обычно загружаю сущности и работаю с динамическими прокси. Обычно в пакетных процессах вам необходимо загружать данные в любом случае во время работы службы. Я пытаюсь выполнить пакетную загрузку данных вместо использования метода find, чтобы сэкономить время. В зависимости от процесса я использую оптимистический или пессимистический контроль параллелизма (я всегда использую оптимистичный, за исключением сценариев параллельного выполнения, где мне нужно заблокировать некоторые записи с помощью простых операторов SQL, хотя это случается редко). В зависимости от кода и сценария влияние может быть уменьшено почти до нуля.
Для клиентских сценариев у вас есть несколько вариантов
Используйте просмотр моделей. Модели должны иметь свойство UpdateStatus (не изменено-вставлено-обновлено-удалено). Клиент обязан установить правильное значение для этого столбца в зависимости от действий пользователя (insert-update-delete). Сервер может либо запросить в БД исходные значения, либо клиент должен отправить исходные значения на сервер вместе с измененными строками. Сервер должен прикрепить исходные значения и использовать столбец UpdateStatus для каждой строки, чтобы решить, как обрабатывать новые значения. В этом сценарии я всегда использую оптимистичный параллелизм. Это будет делать только операторы вставки - обновления - удаления, а не какие-либо операции выбора, но может потребоваться некоторый умный код для обхода графика и обновления сущностей (зависит от вашего сценария - приложения). Картограф может помочь, но не обрабатывает логику CRUD.
Используйте такую библиотеку, как breeze.js, которая скрывает большую часть этой сложности (как описано в 1), и попытайтесь приспособить ее к вашему варианту использования.
Надеюсь, поможет
источник