Я пытаюсь обновить запись с помощью EF6. Сначала найдя запись, если она существует, обновите ее. Вот мой код: -
var book = new Model.Book
{
BookNumber = _book.BookNumber,
BookName = _book.BookName,
BookTitle = _book.BookTitle,
};
using (var db = new MyContextDB())
{
var result = db.Books.SingleOrDefault(b => b.BookNumber == bookNumber);
if (result != null)
{
try
{
db.Books.Attach(book);
db.Entry(book).State = EntityState.Modified;
db.SaveChanges();
}
catch (Exception ex)
{
throw;
}
}
}
Каждый раз, когда я пытаюсь обновить запись, используя приведенный выше код, я получаю эту ошибку: -
{System.Data.Entity.Infrastructure.DbUpdateConcurrencyException: оператор обновления, вставки или удаления магазина затронул непредвиденное количество строк (0). Объекты могут быть изменены или удалены с момента загрузки объектов. Обновить объект ObjectStateManager
c#
entity-framework
entity-framework-6
ef-database-first
user1327064
источник
источник
catch (Exception ex){throw;}
избыточно, и вы можете полностью удалить его.Ответы:
Вы пытаетесь обновить запись (что для меня означает «изменить значение в существующей записи и сохранить его обратно»). Таким образом, вам нужно извлечь объект, внести изменения и сохранить его.
источник
db.SaveChanges()
с измененными объектами в контексте обновляет базу данных.SaveChanges
контекст, оценивает все объекты, которые он отслеживает, чтобы определить, были ли они добавлены, изменены или удалены, и выдает соответствующий SQL для подключенной базы данных.Я просматривал исходный код Entity Framework и нашел способ действительно обновить сущность, если вы знаете свойство Key:
В противном случае проверьте реализацию AddOrUpdate для идей.
Надеюсь, это поможет!
источник
SaveChanges()
вызов требуется после установки значений.Вы можете использовать
AddOrUpdate
метод:источник
.AddOrUpdate()
используется во время миграции базы данных, поэтому не рекомендуется использовать этот метод вне миграций, поэтому он находится вEntity.Migrations
пространстве имен.AddOrUpdate()
метод предназначен для миграций и не подходит для ситуаций, когда вам нужно только обновить существующую строку. В случае, если у вас нет книги с поисковой ссылкой (т.е. идентификатором), она создаст новую строку, и это может быть проблемой в некоторых случаях (например, у вас есть API, который должен вернуть вам ответ 404-NotFound, если вы попробуйте вызвать метод PUT для несуществующей строки).Итак, у вас есть объект, который обновляется, и вы хотите обновить его в базе данных с наименьшим количеством кода ...
Параллелизм всегда сложен, но я предполагаю, что вы просто хотите, чтобы ваши обновления выигрывали. Вот как я сделал это для моего же случая и изменил имена, чтобы имитировать ваши классы. Другими словами, просто измените
attach
наadd
, и это работает для меня:источник
Вам следует использовать метод Entry (), если вы хотите обновить все поля в вашем объекте. Также имейте в виду, что вы не можете изменить идентификатор поля (ключ), поэтому сначала установите Id на то же, что и при редактировании.
источник
Этот код является результатом теста для обновления только набора столбцов без выполнения запроса на возврат записи в первую очередь. Сначала он использует код Entity Framework 7.
Вот полный код:
источник
Для ядра .net
источник
Вот лучшее решение для этой проблемы: Во View добавьте все идентификаторы (ключи). Подумайте о наличии нескольких таблиц с именами (первая, вторая и третья)
В коде C #
источник
Attach
При создании объекта его состояние отслеживания устанавливается равнымUnchanged
. Чтобы обновить существующую сущность, все, что вам нужно сделать, это установить состояние отслеживания вModified
. Согласно документам EF6 :источник
источник
Я нашел способ, который работает просто отлично.
источник
Вы должны удалить
db.Books.Attach(book);
источник
Вот мой метод обновления сущностей после RIA (для периода времени Ef6):
Обратите внимание, что
FrameworkTypeUtility.SetProperties()
это крошечная служебная функция, которую я написал задолго до AutoMapper на NuGet:источник
Как сказал Ренат, удалите:
db.Books.Attach(book);
Кроме того, измените свой результат запроса, чтобы использовать «AsNoTracking», потому что этот запрос отбрасывает состояние модели структуры сущности. Он думает, что «результат» - это книга, которую нужно отслеживать, а вы этого не хотите.
источник
Попытайся....
UpdateModel (книга);
источник
Я знаю, что на это уже отвечали несколько раз, но мне нравится ниже способ сделать это. Надеюсь, это кому-нибудь поможет.
источник
Это если для Entity Framework 6.2.0.
Если у вас есть конкретный
DbSet
предмет и предмет, который необходимо обновить или создать:Однако это также может быть использовано для универсального
DbSet
с одним первичным ключом или составным первичным ключом.источник