¿Cómo actualizar el registro usando Entity Framework 6?

Resuelto user1327064 asked hace 10 años • 0 respuestas

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

user1327064 avatar Sep 17 '14 22:09 user1327064
Aceptado

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();
    }
}
Craig W. avatar Sep 17 '2014 18:09 Craig W.

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!

Miguel avatar Apr 18 '2016 02:04 Miguel

Puedes utilizar el AddOrUpdatemétodo:

db.Books.AddOrUpdate(book); //requires using System.Data.Entity.Migrations;
db.SaveChanges();
nicedev92 avatar Oct 12 '2016 16:10 nicedev92

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 attacha addy 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();
    }
}
Duray Akar avatar May 12 '2017 17:05 Duray Akar