¿Cómo actualizar el registro usando Entity Framework 6?
Estoy intentando actualizar un registro usando EF6. Primero busque el registro, si existe, actualícelo. Aquí está mi código:
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;
}
}
}
Cada vez que intento actualizar el registro usando el código anterior, aparece este error:
{System.Data.Entity.Infrastructure.DbUpdateConcurrencyException: la declaración de actualización, inserción o eliminación del almacén afectó a un número inesperado de filas (0). Es posible que las entidades se hayan modificado o eliminado desde que se cargaron. Actualizar las entradas de ObjectStateManager
Estás intentando actualizar el registro (lo que para mí significa "cambiar un valor en un registro existente y volver a guardarlo"). Por lo tanto, debe recuperar el objeto, realizar un cambio y guardarlo.
using (var db = new MyContextDB())
{
var result = db.Books.SingleOrDefault(b => b.BookNumber == bookNumber);
if (result != null)
{
result.SomeValue = "Some new value";
db.SaveChanges();
}
}
He estado revisando el código fuente de Entity Framework y encontré una manera de actualizar una entidad si conoce la propiedad Clave:
public void Update<T>(T item) where T: Entity
{
// assume Entity base class have an Id property for all items
var entity = _collection.Find(item.Id);
if (entity == null)
{
return;
}
_context.Entry(entity).CurrentValues.SetValues(item);
}
De lo contrario, consulte la implementación de AddOrUpdate para obtener ideas.
¡Espero que esto ayude!
Puedes utilizar el AddOrUpdate
método:
db.Books.AddOrUpdate(book); //requires using System.Data.Entity.Migrations;
db.SaveChanges();
Entonces tienes una entidad que está actualizada y quieres actualizarla en la base de datos con la menor cantidad de código...
La simultaneidad siempre es complicada, pero supongo que lo único que quieres es que ganen tus actualizaciones. Así es como lo hice para mi mismo caso y modifiqué los nombres para imitar sus clases. En otras palabras, simplemente cambie attach
a add
y funciona para mí:
public static void SaveBook(Model.Book myBook)
{
using (var ctx = new BookDBContext())
{
ctx.Books.Add(myBook);
ctx.Entry(myBook).State = System.Data.Entity.EntityState.Modified;
ctx.SaveChanges();
}
}