No se puede actualizar EntitySet porque tiene un elemento DefiningQuery y no hay ningún elemento .

Estoy usando Entity Framework 1 con .net 3.5.

Estoy haciendo algo simple como esto:

var RoomDetails = context.Rooms.ToList(); foreach (var Room in Rooms) { Room.LastUpdated = DateTime.Now; } 

Recibo este error cuando trato de hacer:

  context.SaveChanges(); 

Me sale el error:

No se puede actualizar EntitySet, porque tiene un elemento DefiningQuery y no existe un elemento en el elemento para admitir la operación actual.

Estoy haciendo muchas actualizaciones sobre el contexto y no tengo problemas, solo cuando trato de actualizar esta entidad en particular.

Toda mi búsqueda muestra lo mismo, que no hay una clave primaria declarada en la entidad que estoy tratando de actualizar. Pero, por desgracia, tengo una clave principal declarada …

Suele suceder debido a una de las siguientes razones:

  • Entity Set se mapea desde la vista de la base de datos
  • Una consulta de base de datos personalizada
  • La tabla de base de datos no tiene una clave principal

Después de hacerlo, es posible que aún necesite actualizar en el diseñador de Entity Framework (o, alternativamente, eliminar la entidad y luego agregarla) antes de dejar de obtener el error.

Simplemente agregue una clave principal a la tabla. Eso es. Problema resuelto.

 ALTER TABLE  ADD CONSTRAINT  PRIMARY KEY() 

Este es el caso para mí. Simplemente eliminar resultó en otro error. Seguí los pasos de esta publicación, excepto la última. Para su conveniencia, copié los 4 pasos de la publicación que seguí para resolver el problema de la siguiente manera:

  1. Haga clic derecho en el archivo edmx, seleccione Abrir con, editor XML
  2. Ubique la entidad en el elemento edmx: StorageModels
  3. Elimine por completo el DefiningQuery
  4. Cambie el nombre de la store:Schema="dbo" a Schema="dbo" (de lo contrario, el código generará un error diciendo que el nombre no es válido)

Solo tenga en cuenta que tal vez su Entidad tiene clave principal, pero su tabla en la base de datos no tiene clave principal .

ACTUALIZACIÓN: He recibido algunos votos a favor sobre esto últimamente, así que pensé que le haría saber a la gente que el consejo que doy a continuación no es el mejor. Desde que originalmente comencé a utilizar Entity Framework en bases de datos antiguas sin claves, me he dado cuenta de que lo mejor que puedes hacer BY FAR es hacerlo primero con código inverso. Hay algunos buenos artículos sobre cómo hacer esto. Simplemente sígalos, y luego cuando quiera agregarle una clave, use anotaciones de datos para “falsificar” la clave.

Por ejemplo, supongamos que sé que mis Orders mesa, si bien no tienen una clave principal, solo tienen un número de pedido por cliente. Como esas son las dos primeras columnas de la tabla, configuré las primeras clases de código para que se vean así:

  [Key, Column(Order = 0)] public Int32? OrderNumber { get; set; } [Key, Column(Order = 1)] public String Customer { get; set; } 

Al hacer esto, básicamente eres Falsificado haciéndote creer que hay una clave agrupada compuesta de OrderNumber y Customer. Esto le permitirá hacer inserciones, actualizaciones, etc. en su tabla sin llave.

Si no está muy familiarizado con hacer el cambio de código primero, busque primero un buen tutorial sobre Entity Framework Code. Luego vaya a buscar uno en Código inverso primero (que está haciendo Code First con una base de datos existente). Entonces vuelve aquí y mira mi consejo clave de nuevo. 🙂

Respuesta Original :

Primero: como otros han dicho, la mejor opción es agregar una clave principal a la tabla. Punto final. Si puedes hacer esto, no sigas leyendo.

Pero si no puedes, o simplemente te odias a ti mismo, hay una manera de hacerlo sin la clave principal.

En mi caso, estaba trabajando con un sistema heredado (originalmente archivos planos en un AS400 portado a Access y luego transferido a T-SQL). Entonces tuve que encontrar un camino. Esta es mi solución. Lo siguiente funcionó para mí al usar Entity Framework 6.0 (el último en NuGet al momento de escribir esto).

  1. Haga clic derecho en su archivo .edmx en el Explorador de soluciones. Elija “Abrir con …” y luego seleccione “XML (Text) Editor”. Aquí vamos a editar manualmente el código generado automáticamente.

  2. Busque una línea como esta:

  3. Eliminar store:Name="table_name" desde el final.

  4. Cambiar store:Schema="whatever" a Schema="whatever"

  5. Mire debajo de esa línea y encuentre la etiqueta . Tendrá una gran statement selecta en él. Elimina la etiqueta y su contenido.

  6. Ahora tu línea debería verse más o menos así:

  7. Tenemos algo más que cambiar. Revise su archivo y encuentre esto:

  8. Cerca de allí, probablemente verá algún texto comentado advirtiéndole que no tenía una clave principal identificada, por lo que la clave se ha inferido y la definición es una tabla / vista de solo lectura. Puedes dejarlo o eliminarlo. Lo borré.

  9. A continuación está la etiqueta . Esto es lo que Entity Framework va a utilizar para insertar / actualizar / eliminar. ASÍ QUE ASEGÚRESE DE HACER ESTE DERECHO. La propiedad (o propiedades) en esa etiqueta necesita indicar una fila identificable de manera única. Por ejemplo, digamos que sé que mis orders mesa, si bien no tienen una clave principal, solo tienen un número de pedido por cliente.

Entonces el mío se ve así:

      

En serio, no hagas esto mal. Digamos que aunque nunca debe haber duplicados, de alguna manera dos filas ingresan a mi sistema con el mismo número de orden y nombre de cliente. ¡Whooops! ¡Eso es lo que obtengo por no usar una llave! Entonces utilizo Entity Framework para eliminar uno. Como sé que el duplicado es el único pedido presentado hoy, hago esto:

 var duplicateOrder = myModel.orders.First(x => x.order_date == DateTime.Today); myModel.orders.Remove(duplicateOrder); 

¿Adivina qué? ¡Acabo de eliminar tanto el duplicado como el original! Eso es porque le dije a Entity Framework que order_number / cutomer_name era mi clave principal. Entonces, cuando le dije que eliminara duplicateOrder, lo que hizo en el fondo fue algo así como:

 DELETE FROM orders WHERE order_number = (duplicateOrder's order number) AND customer_name = (duplicateOrder's customer name) 

Y con esa advertencia … ¡ahora deberías estar listo!

Esto también puede suceder si el modelo de datos está desactualizado.

Con suerte, esto salvará a alguien más de la frustración 🙂

Recibía el mismo mensaje de error, pero en mi caso, intentaba actualizar las entidades derivadas de una relación de muchos a muchos usando un PJT (tabla de unión pura).

Después de leer las otras publicaciones, pensé que podría solucionarlo agregando un campo PK adicional a la tabla de unión … Sin embargo, si agrega una columna PK a una tabla join, ya no es un PJT y pierde todo el ventajas del marco de la entidad como el mapeo de relaciones automático entre las entidades.

Entonces la solución en mi caso fue alterar la tabla de unión en el DB para hacer un PK que incluye AMBAS columnas de ID extranjeras.

Se puede producir un error, si su tabla no tiene clave principal, en este caso, la tabla es “de solo lectura” y el comando db.SaveChanges () siempre generará un error.

así que es cierto, solo agrega una clave principal

Nota: asegúrese de que cuando actualiza su diagtwig EF de la base de datos que está señalando a la base de datos correcta , en mi caso, la cadena de conexión apuntaba a un DB local en lugar de al Dev DB actualizado, colegial error, lo sé, pero quería publicar esto porque puede ser muy frustrante si estás convencido de que has agregado la clave principal y sigues recibiendo el mismo error

Tuve el mismo problema. Como decía este hilo, Mi tabla no tenía un PK, así que configuré el PK y ejecuté el código. Pero desafortunadamente el error vino de nuevo. Lo que hice a continuación fue eliminar la conexión DB (eliminar el archivo .edmx en la carpeta Model de Solution Explorer) y volver a crearla. Error después de eso Gracias a todos por compartir sus experiencias. Se ahorra mucho tiempo.

Estaba obteniendo este problema porque estaba generando mi EDMX a partir de una base de datos existente (diseñado por otra persona, y uso aquí el término ‘diseñado’ libremente).

Resulta que la mesa no tenía llaves en absoluto. EF estaba generando el modelo con muchas claves múltiples. Tuve que ir a agregar una clave primaria a la tabla db en SQL y luego actualizar mi modelo en VS.

Eso lo solucionó para mí.

Establezca la clave principal luego guarde la tabla y actualice luego vaya a Model.edmx delete Table y vuelva a obtenerla.

¡Agregar la clave principal también funcionó para mí!

Una vez hecho esto, esta es la forma de actualizar el modelo de datos sin eliminarlo:

Haga clic derecho en la página del diseñador de la entidad edmx y ‘Actualizar el modelo desde la base de datos’.

Tuve exactamente el mismo problema. Desafortunadamente, agregar la clave principal no resuelve el problema. Así que así es como resuelvo el mío:

  1. Asegúrese de tener una primary key en la tabla, así que modifico mi tabla y agrego una clave principal.
  2. Delete the ADO.NET Entity Data Model (archivo edmx) donde uso para mapear y conectar con mi base de datos.
  3. Add again a new file of ADO.NET Entity Data Model para conectarse con mi base de datos y para mapear las propiedades de mi modelo.
  4. Clean and rebuild the solution.

Problema resuelto.

solo agrega una clave principal a tu mesa y luego recrea tu FE

Solo tuve que quitar la tabla del modelo y actualizar el modelo de nuevo trayendo la tabla. Supongo que la clave principal se creó después de que la tabla se introdujo en el modelo.

Tuve este problema y creo que fue causado porque eliminé el índice en mi clave principal de tablas y lo reemplacé con un índice en algunos de los otros campos en la tabla.

Después de eliminar el índice de clave principal y actualizar el edmx, las inserciones dejaron de funcionar.

Actualicé la tabla a la versión anterior, actualicé el edmx y todo vuelve a funcionar.

Debo señalar que cuando abrí el EDMX para solucionar este problema, verificando si había una clave principal definida, la había. Entonces ninguna de las sugerencias anteriores me estaba ayudando. Pero actualizar el índice en la clave principal pareció funcionar.

Abra su archivo .edmx en el editor XML y luego elimine la etiqueta de la etiqueta y también cambie la tienda: Schema = “dbo” a Schema = “dbo” y vuelva a generar la solución. El error se resolverá y podrá guardar los datos.