referencia - obtener elemento de una lista c#




No se puede actualizar el EntitySet, ya que tiene un DefiningQuery y no existe ningún elemento<UpdateFunction> (12)

Añadiendo la clave principal funcionó para mí también!

Una vez hecho esto, aquí se explica cómo actualizar el modelo de datos sin borrarlo:

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

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;
}

Estoy recibiendo este error cuando trato de hacer:

 context.SaveChanges();

Me sale el error

No se puede actualizar el EntitySet, ya que tiene un DefiningQuery y no existe ningún elemento <UpdateFunction> en el elemento <ModificationFunctionMapping> para admitir la operación actual.

Estoy realizando muchas actualizaciones en el contexto y no tengo ningún problema, solo cuando intento actualizar esta entidad en particular.

Todas mis búsquedas muestran lo mismo, que no hay una clave primaria declarada en la entidad que estoy intentando actualizar. Pero ay, tengo una clave primaria declarada ...


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


Estaba teniendo este problema porque estaba generando mi EDMX a partir de una base de datos existente (diseñada por otra persona, y uso el término 'diseñado' sin apretar aquí).

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

Eso lo arregló para mí.


Este es el caso para mí. Simplemente eliminar resultó en otro error. Seguí los pasos de este post excepto el último. Para su comodidad, 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. Localice la entidad en el elemento edmx: StorageModels
  3. Eliminar el DefiningQuery por completo
  4. Cambie el nombre de la store:Schema="dbo" a Schema="dbo" (de lo contrario, el código generará un error que dice que el nombre no es válido)

Recibía el mismo mensaje de error, pero en mi escenario intentaba actualizar las entidades derivadas de una relación de muchos a muchos utilizando un PJT (Pure Join Table).

Después de leer las otras publicaciones, pensé que podría arreglarlo agregando un campo PK adicional a la tabla de combinación ... Sin embargo, si agrega una columna PK a una tabla de combinación, ya no es un PJT y pierde todo el Ventajas del framework de entidades como la correlación automática de relaciones entre las entidades.

Así que la solución en mi caso fue alterar la tabla de unión en la base de datos para hacer un PK que incluya AMBAS columnas de ID externas.


Solo agrega una clave primaria a la tabla. Eso es. Problema resuelto.

ALTER TABLE <TABLE_NAME>
ADD CONSTRAINT <CONSTRAINT_NAME> PRIMARY KEY(<COLUMN_NAME>)

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


Suele suceder porque una de las siguientes razones:

  • El conjunto de entidades se asigna desde la vista Base de datos
  • Una consulta de base de datos personalizada
  • La tabla de la base de datos no tiene una clave primaria

Después de hacerlo, es posible que aún debas actualizar en el diseñador de Entity Framework (o, de forma alternativa, eliminar la entidad y luego agregarla) antes de que dejes de recibir el error.


Tuve el mismo problema. Como decía este hilo, Mi mesa no tenía un PK, así que configuré el PK y ejecuté el código. Pero lamentablemente el error vino de nuevo. Lo que hice a continuación fue eliminar la conexión de base de datos (eliminar el archivo .edmx en la carpeta Modelo del Explorador de soluciones) y recrearlo. Error ido después de eso. Gracias a todos por compartir sus experiencias. Se ahorra mucho tiempo.


Tuve este problema y creo que se debió a que eliminé el Índice en la clave principal de mis tablas y lo reemplacé con un índice en algunos de los otros campos de 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é edmx y todo funciona de nuevo.

Debo tener en cuenta que cuando abrí el EDMX para solucionar este problema, verificando si había una clave primaria definida, la había. Así que ninguna de las sugerencias anteriores me ayudó. Pero actualizar el índice en la clave principal parecía funcionar.


simplemente agregue una clave principal a su tabla y luego vuelva a crear su EF


ACTUALIZACIÓN: Últimamente recibí algunos comentarios positivos sobre esto, 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 comencé a hablar sobre el Entity Framework en bases de datos antiguas sin llave, me he dado cuenta de que lo mejor que puedes hacer ANTES es hacerlo mediante el código inverso primero. Hay algunos buenos artículos sobre cómo hacer esto. Simplemente sígalas y luego, cuando desee agregarle una clave, use las anotaciones de datos para "falsificar" la clave.

Por ejemplo, digamos que conozco mis Orders mesa, aunque no tiene una clave principal, se garantiza que solo tendrá un número de pedido por cliente. Dado que 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 se hace EF falsamente para creer que hay una clave agrupada compuesta por Número de pedido y Cliente. Esto le permitirá hacer inserciones, actualizaciones, etc. en su tabla sin llave.

Si no está muy familiarizado con hacer Código inverso primero, vaya y busque un buen tutorial sobre Código Entity Framework Primero. Luego, busque uno en Reverse Code First (que está haciendo Code First con una base de datos existente). Entonces vuelve aquí y mira mi consejo clave otra vez. :)

Respuesta original :

Primero: como han dicho otros, la mejor opción es agregar una clave principal a la tabla. Parada completa 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 portado a T-SQL). Así que tuve que encontrar un camino. Esta es mi solución. Lo siguiente me funcionó usando Entity Framework 6.0 (lo último en NuGet a partir de este escrito).

  1. Haga clic derecho en su archivo .edmx en el Explorador de soluciones. Elija "Abrir con ..." y luego seleccione "Editor de XML (texto)". Vamos a editar manualmente el código generado automáticamente aquí.

  2. Busca una línea como esta:
    <EntitySet Name="table_name" EntityType="MyModel.Store.table_name" store:Type="Tables" store:Schema="dbo" store:Name="table_nane">

  3. Eliminar store:Name="table_name" del final.

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

  5. Mire debajo de esa línea y encuentre la etiqueta <DefiningQuery> . Tendrá una gran declaración selecta en ella. Eliminar la etiqueta y su contenido.

  6. Ahora tu línea debe verse algo como esto:
    <EntitySet Name="table_name" EntityType="MyModel.Store.table_name" store:Type="Tables" Schema="dbo" />

  7. Tenemos algo más que cambiar. Ir a través de su archivo y encontrar esto:
    <EntityType Name="table_name">

  8. En las inmediaciones probablemente verá algún texto comentado que le advierte que no se identificó una clave principal, por lo que la clave se ha deducido y la definición es una tabla / vista de solo lectura. Puedes dejarlo o borrarlo. Lo borré.

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

Así que el mío se parece a

<EntityType Name="table_name">
              <Key>
                <PropertyRef Name="order_numbers" />
                <PropertyRef Name="customer_name" />
              </Key>

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

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

¿Adivina qué? Acabo de borrar tanto el duplicado Y el original! Eso es porque le dije a Entity Framework que order_number / cutomer_name era mi clave principal. Así que cuando le dije que eliminara la orden duplicada, 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 ... ¡ya deberías estar listo!







primary-key