Estoy tratando de actualizar el registro usando EF6. Primero encuentre 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 con 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ó un número inesperado de filas (0). Las entidades pueden haber sido modificadas o eliminadas desde que se cargaron las entidades. Actualizar entrada de ObjectStateManager
c#
entity-framework
entity-framework-6
ef-database-first
usuario1327064
fuente
fuente
catch (Exception ex){throw;}
es redundante y puede eliminarlo por completo.Respuestas:
Estás intentando actualizar el registro (lo que para mí significa "cambiar un valor en un registro existente y guardarlo de nuevo"). Por lo tanto, debe recuperar el objeto, realizar un cambio y guardarlo.
fuente
db.SaveChanges()
con objetos modificados en el contexto actualiza la base de datos.SaveChanges
al contexto, evalúa todos los objetos que está rastreando para determinar si se agregan, cambian o eliminan y emite el SQL apropiado a la base de datos conectada.He estado revisando el código fuente de Entity Framework y encontré una manera de actualizar realmente una entidad si conoces la propiedad Key:
De lo contrario, verifique la implementación de AddOrUpdate para obtener ideas.
¡Espero que esto ayude!
fuente
SaveChanges()
se requiere una llamada después de establecer los valores.Puedes usar el
AddOrUpdate
método:fuente
.AddOrUpdate()
se usa durante la migración de la base de datos, no se recomienda utilizar este método fuera de las migraciones, por lo tanto, está en elEntity.Migrations
espacio de nombres.AddOrUpdate()
método está destinado a migraciones y no es adecuado para situaciones en las que solo necesita actualizar la fila existente. En caso de que no tenga un libro con referencia de búsqueda (es decir, ID), creará una nueva fila y puede ser un problema en los próximos casos (por ejemplo, tiene una API que necesita devolverle la respuesta 404-NotFound si intente llamar al método PUT para una fila no existente).Entonces, tiene una entidad que se actualiza y desea actualizarla en la base de datos con la menor cantidad de código ...
La concurrencia siempre es complicada, pero supongo que solo quieres que tus actualizaciones ganen. Así es como lo hice para mi mismo caso y modifiqué los nombres para imitar sus clases. En otras palabras, simplemente cambie
attach
aadd
, y funciona para mí:fuente
Debe usar el método Entry () en caso de que desee actualizar todos los campos de su objeto. También tenga en cuenta que no puede cambiar la identificación del campo (clave), por lo tanto, primero configure la Id al mismo tiempo que edita.
fuente
Este código es el resultado de una prueba para actualizar solo un conjunto de columnas sin hacer una consulta para devolver el registro primero. Utiliza el código de Entity Framework 7 primero.
Aquí está el código completo:
fuente
Para .net core
fuente
Aquí está la mejor solución para este problema: en la vista, agregue todas las ID (claves). Considere tener varias tablas con nombre (Primero, Segundo y Tercero)
En el código C #,
fuente
Attach
ing una entidad establecerá su estado de seguimiento enUnchanged
. Para actualizar una entidad existente, todo lo que necesita hacer es establecer el estado de seguimiento enModified
. Según los documentos de EF6 :fuente
fuente
Encontré una manera que funciona bien.
fuente
Deberías eliminar
db.Books.Attach(book);
fuente
Aquí está mi método de actualización de entidad posterior a RIA (para el marco de tiempo Ef6):
Tenga en cuenta que
FrameworkTypeUtility.SetProperties()
es una pequeña función de utilidad que escribí mucho antes de AutoMapper en NuGet:fuente
Como dijo Renat, elimine:
db.Books.Attach(book);
Además, cambie su consulta de resultados para usar "AsNoTracking", porque esta consulta está desviando el estado del modelo del marco de la entidad. Piensa que "resultado" es el libro a seguir ahora y no quieres eso.
fuente
Intentalo....
UpdateModel (libro);
fuente
Sé que ya se ha respondido bien algunas veces, pero me gusta la siguiente forma de hacerlo. Espero que ayude a alguien.
fuente
Esto si para Entity Framework 6.2.0.
Si tiene un elemento específico
DbSet
y un elemento que necesita actualizarse o crearse:Sin embargo, esto también se puede usar para un genérico
DbSet
con una sola clave primaria o una clave primaria compuesta.fuente