update - query entity framework c#
La actualización de la tienda, insertar o eliminar una declaración afectó un número inesperado de filas(0) EntityFramework (16)
Agrega esto a tu edit.cshtml
@Html.HiddenFor(model => model.Id)
Tuve este problema y encontré que la identificación se encontraba en 0 ya que no estaba en la página.
También tengo esto en mi ViewModel (estoy usando el enfoque del modelo de vista)
[HiddenInput(DisplayValue = false)]
[Key]
public int Id { get; set; }
Esta pregunta ya tiene una respuesta aquí:
Sigo recibiendo el siguiente error cuando intento guardar los cambios realizados en un contexto:
La actualización de la tienda, insertar o eliminar una declaración afectó un número inesperado de filas (0). Las entidades pueden haber sido modificadas o eliminadas desde que se cargaron las entidades. Actualizar las entradas de ObjectStateManager.
Tengo las siguientes clases:
Persona
public class Person : IPerson
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Name
{
get
{
return FirstName + " " + LastName;
}
set{}
}
public string Email { get; set; }
public DateTime? LastModified { get; set; }
public virtual ICollection<Result> Results { get; set; }
}
Perfil del usuario
public class UserProfile : Person
{
public UserProfile()
{
Faculty = new Faculty();
Projects = new Collection<Project>();
Results = new Collection<Result>();
}
public string UserName { get; set; }
public string CNP { get; set; }
public virtual Faculty Faculty { get; set; }
public virtual ICollection<Project> Projects { get; set; }
}
Resultado
public abstract class Result:INamedEntity
{
protected Result()
{
ResultType = new ResultType();
}
public int Id { get; set; }
public string Name{get;set;}
public virtual ResultType ResultType { get; set; }
public virtual ICollection<Person> People { get; set; }
public DateTime? LastModified { get; set; }
}
Después agrego un valor al contexto usando:
_ctx.Users.Single(u => u.Id == userId).Results.Add(result);
Recibo el error cuando llamo a _ctx.SaveChanges()
Actualicé mi función a:
public bool Save()
{
try
{
_ctx.SaveChanges();
}
catch (OptimisticConcurrencyException)
{
((IObjectContextAdapter)_ctx).ObjectContext.Refresh(RefreshMode.ClientWins,_ctx.Users);
((IObjectContextAdapter)_ctx).ObjectContext.Refresh(RefreshMode.ClientWins,_ctx.Results);
_ctx.SaveChanges();
}
return true;
}
Pero el error no está atrapado. Gracias
Asegúrese de pasar la ID de ambas tablas al modelo desde la vista. En su caso, es la clave para la tabla Persona y Perfil de usuario. Si no necesita mostrar el ID en la página, puede agregar @ Html.HiddenFor (model => model.PersonId) y @ Html.HiddenFor (model => model.UserProfileId)
Bueno, también enfrenté este tipo de error de concurrencia al trabajar con Entity Framework 6.13 usando Code First. Y también luché durante horas antes de resolverlo yo mismo. Así que puede ayudar a alguien por ahí. Se creó una tabla con claves primarias compuestas y hoy cambié la estructura de la tabla e hice solo una clave primaria (con AutoIncrement) en lugar de claves compuestas y actualizo la tabla a través de migraciones con configuraciones de api fluidas. La tabla se actualizó pero la clave principal no se actualizó con AutoIncrement y cada vez que intentaba agregar un registro, mostraba el error de concurrencia. Entonces, cuando configuré el autoincremento del campo y el error desapareció. Espero eso ayude.
En mi caso, tenía una clave compuesta e intentaba actualizar parte de ella (3 columnas constituyen una clave compuesta, de la cual solo estaba actualizando la tercera columna), pero EF no permitió cambiar los valores de clave para el mismo objeto. Se logró actualizar el registro a través de:
Context.Database.ExecuteSqlCommand(udpateCommand);
Encontré este error al crear un proyecto, incluso tratando de hacer una inserción simple.
Estábamos generando el modelo EF a partir de una base de datos preexistente, y el marco configuró automáticamente la Entity Key = True
en múltiples campos.
La configuración de todos menos el ID en False
solucionó el problema.
Gracias Terry, agreguemos esto: NO agregues el atributo [Requerido] a tu Clave / ID cuando estés en los andamios. Esto evita que su contexto extraiga la clave / id de la url. También: Esto me sucedió en un controlador de andamio después de una migración que incluyó nuevos campos booleanos en el modelo. Estos campos no fueron establecidos.
Hay un conflicto, ya que está utilizando el bloqueo optimista. Resuelva los problemas de concurrencia utilizando las entradas del ObjectStateManager y guarde los cambios nuevamente. Algún código de muestra está en el sitio de MSDN
Lo averigué. El problema fue que dos de nosotros estamos trabajando en este proyecto, y mi colega creó su propia instancia de DBContext
que estaba actualizando una y yo la otra. Entonces, para quien tenga este problema en el futuro, asegúrese de no tener dos instancias diferentes de su DBContext
al mismo tiempo.
Me encontré con este mensaje de error también. Lo que causó mi error fue conflictos de clave primaria / externa. Había insertado algunos datos nuevos en mi base de datos y mis valores de clave externa estaban desactivados (error en mi script de carga).
Use el Analizador de SQL para ayudar a rastrear el script de inserción ofensivo, esto probablemente lo ayudará a descubrir cuál es el problema con la actualización.
Espero que esto ayude a alguien más con problemas similares.
Me encontré con esto cuando googleing. Tuve el mismo mensaje de error, pero el motivo resultó ser que no establecí algunos valores obligatorios no nulos.
Tal vez este hallazgo ayude a alguien.
No sé qué fue exactamente lo que estaba mal, pero simplemente hice estos pasos y se resolvieron. (Espero que puedas resolver esto ya que pude hacerlo)
Los pasos son los siguientes:
(1) Agregue el nuevo controlador utilizando andamios sobre la base de su tabla edmx y el contexto DB del archivo EF.
(2) Ahora, donde los cambios guardados crean el problema es el método de edición.
(3) Ahora copie el método de edición / controlador completo hecho de andamios y péguelo en su controlador original.
(4) ahora solo construye el programa y listo, ya está listo.
Actualizar
Descubrí que para editar los datos desde la vista, todos los campos deben enviarse por escrito nuevamente al controlador. Si en el momento de la edición falta alguno de los campos de la tabla de entidades, no se podrá editar. Especialmente si PK está en Etiqueta y se envía al controlador para su edición, generará este error.
Para mí, el problema era que no había configurado correctamente los enlaces de acción :
public ActionResult Edit([Bind(Include = "VehicleID,Name,CreateDate,PowerPS,DrivenKM")] Car car)
{ ... }
El VehicleID se asignó con el identificador incorrecto, por lo tanto, Entity Framework siempre obtuvo 0 como clave principal.
Si alguna vez se encontró con este problema y ninguna de las soluciones anteriores lo ayudó, tal vez pueda intentarlo. También tuve este extraño problema, y la forma en que pude arreglarlo es que he establecido el campo a en clave principal y lo tengo auto incrementado o configurado en Identidad. Supongamos que tiene la tabla Persona y que tal vez tenga una ID de persona, configúrela en la clave principal y asegúrese de que se incremente automáticamente.
Solucioné un código que daba el mismo mensaje de error al intentar actualizar un registro. Tuve el siguiente código inicialmente:
[HttpPost]
public ActionResult Edit(Project project)
{
if (ModelState.IsValid)
{
entity.Entry(project).State = EntityState.Modified;
entity.SaveChanges();
return RedirectToAction("Index", "Home");
}
return View(project);
}
En lugar del siguiente código
[HttpPost]
public ActionResult Edit(Project project)
{
if (ModelState.IsValid)
{
entity.Entry(project).State = EntityState.Added;
entity.SaveChanges();
return RedirectToAction("Index", "Home");
}
return View(project);
}
Su excepción significa que, entre el momento en que recuperó los datos de la base de datos y los modificó, sus datos fueron modificados.
De forma predeterminada, Entity Framework implementa un modelo de concurrencia optimista. Esto significa que los bloqueos no se mantienen en los datos en la fuente de datos entre cuando se consultan los datos y se actualizan los datos. MSDN
cómo gestionar la concurrencia en un contexto de objeto. MSDN
agregar la siguiente sobrecarga a mi clase DbContext:
using System.Data.Entity.Core.Objects;
using System.Data.Entity.Infrastructure;
public class MyDbContext: DbContext {
...
public int SaveChanges(bool refreshOnConcurrencyException, RefreshMode refreshMode = RefreshMode.ClientWins) {
try {
return SaveChanges();
}
catch (DbUpdateConcurrencyException ex) {
foreach (DbEntityEntry entry in ex.Entries) {
if (refreshMode == RefreshMode.ClientWins)
entry.OriginalValues.SetValues(entry.GetDatabaseValues());
else
entry.Reload();
}
return SaveChanges();
}
}
}
Luego se llama SaveChanges(true)
donde sea aplicable.