Estoy usando Entity Framework para llenar un control de cuadrícula. A veces, cuando hago actualizaciones me sale el siguiente error:
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 entradas de ObjectStateManager.
No puedo entender cómo reproducir esto. Pero podría tener algo que ver con cuán juntas realizo las actualizaciones. ¿Alguien ha visto esto o alguien sabe a qué se refiere el mensaje de error?
Editar: Desafortunadamente, ya no tengo libertad para reproducir el problema que estaba teniendo aquí, porque me alejé de este proyecto y no recuerdo si finalmente encontré una solución, si otro desarrollador la arregló o si lo solucioné. Por lo tanto, no puedo aceptar ninguna respuesta.
fuente
Request.Uri
para ver la URL de solicitud real. En mi caso, tenía cierta lógica de seguimiento que estaba afectando mi sitio y cargando innecesariamente el contexto desde el DB (y ocasionalmente actualizándolo también). Entonces, a la página real que estaba depurando se le había pisoteado la información con una estúpida lógica de código de seguimiento.Respuestas:
Ese es un efecto secundario de una característica llamada concurrencia optimista.
No estoy 100% seguro de cómo activarlo / desactivarlo en Entity Framework, pero básicamente lo que te dice es que entre cuando tomaste los datos de la base de datos y cuando guardaste los cambios, otra persona cambió los datos (lo que significaba cuando fuiste para guardarlo 0 filas realmente se actualizaron). En términos de SQL,
update
lawhere
cláusula de su consulta contiene el valor original de cada campo en la fila, y si se ven afectadas 0 filas, sabe que algo salió mal.La idea detrás de esto es que no terminará sobrescribiendo un cambio que su aplicación no sabía que sucedió; es básicamente una pequeña medida de seguridad incorporada por .NET en todas sus actualizaciones.
Si es coherente, es probable que esté sucediendo dentro de su propia lógica (por ejemplo: en realidad está actualizando los datos usted mismo en otro método entre la selección y la actualización), pero podría ser simplemente una condición de carrera entre dos aplicaciones.
fuente
Me encontré con esto y fue causado por el campo ID (clave) de la entidad que no se establece. Por lo tanto, cuando el contexto fue para guardar los datos, no pudo encontrar una ID = 0. Asegúrese de colocar un punto de interrupción en su declaración de actualización y verifique que se haya establecido la ID de la entidad.
Del comentario de Paul Bellora
fuente
Wow, muchas respuestas, pero recibí este error cuando hice algo ligeramente diferente que nadie más ha mencionado.
En pocas palabras, si crea un nuevo objeto y le dice a EF que se modificó usando el
EntityState.Modified
, arrojará este error ya que aún no existe en la base de datos. Aquí está mi código:Sí, esto parece una tontería, pero surgió porque el método en cuestión solía
foo
haberse creado antes, ahora solo se lo hasomeValue
pasado y creafoo
sí mismo.Fijar fácil, simplemente el cambio
EntityState.Modified
deEntityState.Added
o cambio que toda la línea a:fuente
Estaba enfrentando este mismo error aterrador ... :) Entonces me di cuenta de que me estaba olvidando de establecer un
@Html.HiddenFor(model => model.UserProfile.UserId)
para la clave principal del objeto que se actualiza! ¡Tiendo a olvidar esta cosita simple pero muy importante!
Por cierto:
HiddenFor
es para ASP.NET MVC.fuente
UserId
en el formulario, muy propenso a los piratas informáticos ... esto debe rellenarse después deHttpContext.Current.User.Identity.Name
HiddenFor
que necesitará obtenerlo deHttpContext
todos modos ... No pondría esta propiedad en el formulario, lo que me obligaría a poblarlo siempre en el lado del servidor ...Compruebe si olvidó el atributo "DataKeyNames" en GridView. es imprescindible al modificar datos dentro de GridView
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.datakeynames.aspx
fuente
El problema es causado por una de dos cosas: -
Concurrency Mode: Fixed
... y la Concurrencia optimista evitó que se guardaran los datos. Es decir. algunos cambiaron los datos de la fila entre el momento en que recibió los datos del servidor y cuando guardó los datos del servidor.StoreGeneratedPattern = Computed
) y esa fila no existe.fuente
Obtuve este mismo error porque parte de la PK era una columna de fecha y hora, y el registro que se insertaba usa DateTime.Now como el valor para esa columna. El marco de la entidad insertaría el valor con una precisión de milisegundos y luego buscaría el valor que acaba de insertar también con una precisión de milisegundos. Sin embargo, SqlServer había redondeado el valor a una segunda precisión y, por lo tanto, el marco de la entidad no pudo encontrar el valor de precisión de milisegundos.
La solución fue truncar los milisegundos de DateTime.Now antes de insertar.
fuente
Date
columna con unDateTime
valorEstaba teniendo el mismo problema y la respuesta de @ webtrifusion ayudó a encontrar la solución.
Mi modelo estaba usando el
Bind(Exclude)
atributo en la ID de la entidad, lo que causaba que el valor de la ID de la entidad fuera cero en HttpPost.fuente
Tuve el mismo problema, descubrí que fue causado por RowVersion, que era nulo. Verifique que su ID y su RowVersion no sean nulos .
Para obtener más información, consulte este tutorial
http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/handling-concurrency-with-the-entity-framework-in-an-asp-net-mvc-application
fuente
Comencé a recibir este error después de cambiar de modelo primero a código primero. Tengo varios subprocesos que actualizan una base de datos donde algunos podrían actualizar la misma fila. No sé por qué no tuve problemas al usar model-first, supongamos que usa un valor predeterminado de concurrencia diferente.
Para manejarlo en un lugar sabiendo las condiciones bajo las cuales podría ocurrir, agregué la siguiente sobrecarga a mi clase DbContext:
Luego se llama
SaveChanges(true)
cuando corresponda.fuente
Debe incluir explícitamente un BoundField de la clave primaria. Si no desea que el usuario vea la clave principal, debe ocultarla mediante css:
Donde 'oculto' es una clase en css que tiene su pantalla configurada en 'ninguna'.
fuente
Mientras edita, incluya la identificación o la clave principal de la entidad como un campo oculto en la vista
es decir
Eso resuelve el problema.
Además, si su modelo incluye un elemento no utilizado, inclúyalo también y publíquelo en el controlador
fuente
También me encontré con este error. El problema resultó que fue causado por un Trigger en la mesa en la que intentaba guardar. El activador usó 'INSTEAD OF INSERT', lo que significa que 0 filas alguna vez se insertaron en esa tabla, de ahí el error. Afortunadamente, en muchos casos, la funcionalidad del disparador era incorrecta, pero supongo que podría ser una operación válida que de alguna manera debería manejarse en código. Espero que esto ayude a alguien algún día.
fuente
SELECT SCOPE_IDENTITY() as MyViewId
Me encontré con este problema en una tabla a la que le faltaba una clave principal y tenía una columna DATETIME (2, 3) (por lo que la "clave principal" de la entidad era una combinación de todas las columnas) ... Al realizar la inserción, la marca de tiempo tenía un tiempo más preciso (2018-03-20 08: 29: 51.8319154) que se truncó a (2018-03-20 08: 29: 51.832) por lo que la búsqueda en los campos clave falla.
fuente
También tuve este error. Hay algunas situaciones en las que la Entidad puede no conocer el Contexto de base de datos real que está utilizando o el Modelo puede ser diferente. Para esto, establezca: EntityState.Modified; a EntityState.Added;
Para hacer esto:
Esto asegurará que la Entidad sepa que está utilizando o agregando el Estado con el que está trabajando. En este punto, se deben establecer todos los valores de modelo correctos. Tenga cuidado de no perder ningún cambio que pueda haberse realizado en segundo plano.
Espero que esto ayude.
fuente
Mi versión de fila era nula, así que tuve que agregar esto a la vista que resolvió mi problema
fuente
La línea
[DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.None)]
hizo el truco en mi caso:fuente
Solo asegúrese de que la tabla y el formulario tengan la clave principal y edmx actualizadas.
descubrí que cualquier error durante la actualización generalmente se debía a: - No hay clave principal en la Tabla - No hay clave principal en la vista / formulario Editar (por ejemplo
@Html.HiddenFor(m=>m.Id
)fuente
Yo tuve el mismo problema. En mi caso, estaba tratando de actualizar la clave primaria, que no está permitida.
fuente
Recibí este error esporádicamente cuando uso un
async
método. No ha sucedido desde que cambié a un método sincrónico.Errores esporádicos:
Funciona todo el tiempo:
fuente
Obtuve ese error cuando estaba eliminando algunas filas en la base de datos (en el bucle) y agregando las nuevas en la misma tabla.
La solución para mí fue crear dinámicamente un nuevo contexto en cada iteración de bucle.
fuente
fuente
Esto también sucederá si está intentando insertar en una situación de restricción única, es decir, si solo puede tener un tipo de dirección por empleador e intenta insertar un segundo de ese mismo tipo con el mismo empleador, obtendrá el mismo problema .
O
Esto también podría suceder si todas las propiedades de objeto que se asignaron a ellos se les asignaron los mismos valores que tenían antes.
fuente
Si está intentando crear una asignación en su archivo edmx a una "Importación de funciones", esto puede ocasionar este error. Simplemente borre los campos para insertar, actualizar y eliminar que se encuentran en Detalles de mapeo para una entidad dada en su edmx, y debería funcionar. Espero haberlo dejado claro.
fuente
Obtuve esta excepción al adjuntar un objeto que no existía en la base de datos. Supuse que el objeto se cargó desde un contexto separado, pero si era la primera vez que el usuario visitaba el sitio, el objeto se creaba desde cero. Tenemos claves primarias de incremento automático, por lo que podría reemplazar
con
fuente
Bueno, tengo este mismo problema. Pero esto se debió a mi propio error. En realidad estaba guardando un objeto en lugar de agregarlo. Entonces este fue el conflicto.
fuente
Una forma de depurar este problema en un entorno de servidor SQL es usar el Sql Profiler incluido con su copia de SqlServer, o si usa la versión Express obtenga una copia de Express Profiler gratis de CodePlex mediante el siguiente enlace:
Perfilador Express
Al usar Sql Profiler puede obtener acceso a lo que sea enviado por EF a la base de datos. En mi caso esto ascendió a:
Copié esto pegado en una ventana de consulta en SQL Server y lo ejecuté. Efectivamente, aunque se ejecutó, 0 registros se vieron afectados por esta consulta, por lo tanto, el error fue devuelto por EF.
En mi caso, el problema fue causado por el IdCategoría.
No se identificó ninguna Id. De categoría por el ID EF enviado a la base de datos, por lo tanto, 0 registros se vieron afectados.
Sin embargo, esto no fue culpa de EF, sino más bien un error "nulo" que se unía declaración en un controlador de vista que estaba enviando tonterías al nivel de datos.
fuente
Ninguna de las respuestas anteriores cubrió mi situación y la solución.
Código donde se produjo el error en el controlador MVC5:
Recibí esta excepción cuando estaba guardando un objeto de una vista Editar. La razón por la que lo arrojó fue porque cuando volví a guardarlo, había modificado las propiedades que formaban la clave principal en el objeto. Por lo tanto, establecer su estado en Modificado no tenía ningún sentido para EF: era una entrada nueva, no una guardada anteriormente.
Puede resolver esto ya sea A) modificando la llamada guardada para Agregar el objeto, o B) simplemente no cambie la clave principal en la edición. Hice B).
fuente
Cuando la respuesta aceptada decía " no va a terminar sobrescribiendo un cambio que su aplicación no sabía que sucedió ", estaba escéptico porque mi objeto se acababa de crear. Pero luego resulta que había un
INSTEAD OF UPDATE, INSERT- TRIGGER
adjunto a la tabla que estaba actualizando una columna calculada de la misma tabla.Una vez que cambie esto a
AFTER INSERT, UPDATE
, estaba funcionando bien.fuente
Esto me sucedió debido a una falta de coincidencia entre datetime y datetime2. Curiosamente, funcionó bien antes de que un probador descubriera el problema. El modelo My Code First incluía un DateTime como parte de la clave primaria:
La columna generada es una columna de fecha y hora. Al llamar a SaveChanges, EF generó el siguiente SQL:
Como intentaba hacer coincidir una columna de fecha y hora con un valor de fecha y hora2, no arrojó resultados. La única solución que se me ocurrió fue cambiar la columna a datetime2:
fuente
datetime
frentedatetime2
. Esencialmente, algunos valores de milisegundos se evaluarán para una coincidencia, otros no. Me pasó lo mismo y también cambié aDateTime2
.