Tiene un DefiningQuery pero ningún elemento InsertFunction ... err

123

Esto me está volviendo loco, y el error no tiene sentido para mí:

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

Mis tablas se ponen así:

Tabla A
int idA (identidad, clave primaria)
...

TableB
int idA (FK para TableA.idA)
int val

TableB no tiene una clave primaria definida en el servidor SQL. Entity Framework ha importado la tabla y la asociación y ha establecido ambos campos como clave. ¡Pero generará ese error cuando intento hacer una inserción en la tabla!

¿Qué pasa?


Editar: como lo sugirió Alex, la solución fue esta:

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

Dejé la clave como estaba, ya que estaba bien para mí que ambas columnas sean parte de la clave.

Palantir
fuente
66
Gracias por la actualización: las instrucciones paso a paso ayudaron a este EF newb a hacer que la aplicación tutorial ASP.NET MVC funcione.
Adam Neal
Gracias por esto! Tuve un problema de que EF no generó el archivo edmx adecuado para la tabla del servidor sql 2000 que TIENE la clave principal. Pero esta instrucción me salvó :)
100r
44
3.5 años después, y esta publicación todavía está ayudando a las personas, en este caso, ¡YO! ... A: Palantir por el descriptivo paso a paso (funcionó) y gracias a Alex >>> Bravo!
nanonerd
La solución funcionó para mí ... Gracias
Delavega
El secreto era eliminar "store:" de la definición del esquema. Muy agradable
Guilherme Ferreira

Respuestas:

141

Bueno, cuando se encuentra una tabla sin PrimaryKey, se trata como una Vista.

Y las vistas se muestran en el archivo EDMX (abierto en un editor XML para ver) en el elemento StorageModel \ EntitySet [n] \ DefiningQuery.

Cuando tiene una DefiningQuery, la Entidad se vuelve de solo lectura a menos que agregue funciones de modificación. Necesita 3 funciones de modificación (también conocido como Procedimientos almacenados), una para cada una de Insertar, Actualizar y Eliminar.

Pero tienes dos opciones:

Cambiar la definición clave:

  1. Y convencer al EF de que lo que cree que es una vista es realmente una tabla
  2. O agregue las funciones de modificación apropiadas

En tu caso te recomiendo (1).

Alex James
fuente
Recibí este error cuando intentaba agregar una entidad a una tabla de unión. Su sugerencia lo solucionó, gracias!
Walter Stabosz, el
es excelente ..., gracias
Mohan Gundlapalli
No olvides hacer clic en "Actualizar modelo desde la base de datos" en el archivo .edmx que generaste desde la base de datos primero
Bashar Abu Shamaa
Estoy enfrentando el mismo problema, lo extraño es que funciona bien en nuestro entorno local y de prueba, simplemente no funciona en el entorno del cliente (aburrido)
Mox Shah
13

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

ALTER TABLE <TABLE_NAME>
ADD CONSTRAINT <CONSTRAINT_NAME> PRIMARY KEY(<COLUMN_NAME>)
Jebastin J
fuente
6

Me faltaba una clave principal en mi mesa y recibí este mensaje de error. Una cosa que noté fue que después de agregar la clave a la tabla, necesitaba borrar la tabla del edmx usando el diseñador, guardar el edmx, luego actualizarlo nuevamente para agregar la tabla nuevamente. No estaba recogiendo la clave ya que fue asignado como una vista. Esto no requirió editar el edmx manualmente.

mlapaglia
fuente
5

Agregue la clave principal a la tabla, elimine el modelo del modelo edmx, luego seleccione actualizar desde la base de datos, compile y ejecute ... funciona


fuente
1

@Palantir. Verifique que ambas tablas tengan configuradas las Claves primarias y tenga cuidado con las múltiples claves primarias establecidas en una tabla.

Paulo 'PaulusHC' Gomes
fuente
0
  1. Debe abrir manualmente el archivo .EDMX en el bloc de notas o el bloc de notas ++ o en cualquier editor de texto de su elección.
  2. Localice la entrada en edmx: StorageModels en el archivo abierto en el paso 1.
  3. Encuentre el elemento DefiningQuery y elimine esta etiqueta por completo.
  4. Encuentre la tienda: Schema = "dbo" a Schema = "dbo" (si omite este paso, generará un error de nombre no válido).
  5. Guarde y cierre el archivo.

Espero que resuelva el problema.

Brijesh Kumar Tripathi
fuente