2011-07-21 15 views
24

Al actualizar con la ayuda de LINQ to SQL utilizando Entity Framework, se lanza una excepción.¿Por qué recibo la excepción "No se puede actualizar EntitySet porque tiene una excepción DefiningQuery ..." cuando intento actualizar un modelo en Entity Framework?

System.Data.UpdateException: Unable to update the EntitySet 't_emp' because it has 
a DefiningQuery and no <UpdateFunction> element exists in the 
<ModificationFunctionMapping> 

El código para la actualización es:

public void Updateall() 
    { 
     try 
     { 


      var tb = (from p in _te.t_emp 
         where p.id == "1" 
         select p).FirstOrDefault(); 
      tb.ename = "jack"; 

      _te.ApplyPropertyChanges(tb.EntityKey.EntitySetName, tb); 
      _te.SaveChanges(true); 
     } 
     catch(Exception e) 
     { 

     } 
    } 

¿Por qué recibo este error?

Respuesta

51

el problema estaba en la estructura de la tabla para evitar el erro r tenemos que hacer una clave primaria en la tabla. Después de eso, actualiza el edmx.El problema se solucionará

+0

¡Has ahorrado mi tiempo! Gracias – Hamdi

+0

Mi tiempo también, ¡Gracias! – Bojangles

+0

¡problema muy raro! gracias por ahorrar tiempo –

8

tres cosas:

  1. no debe quedar atrapado excepciones que no se puede manejar. Está atrapando todas las excepciones posibles y luego no haciendo nada con eso (excepto tragarlo). Eso es algo malo ™ ¿De verdad no quiere hacer nada silenciosamente si algo sale mal? Eso lleva a un estado corrupto que es difícil de depurar. No está bien.

  2. Linq to SQL es un ORM, como lo es Entity Framework. Puede estar utilizando LINQ para actualizar los objetos, pero no está utilizando Linq en SQL, está utilizando Entity Framework (Linq to Entities).

  3. ¿Has probado la solución outlined here? La excepción que publicó está algo cortada, así que no puedo estar seguro de que sea exactamente la misma (actualice su publicación si no es así), y si es la misma, ¿puede comentar si funciona o no lo siguiente? ¿tú?

"[..] Entity Framework no sabe si la vista está actualizable o no, por lo que añade el elemento <DefiningQuery> con el fin de salvaguardar en contra de que el intento de marco para generar consultas contra una vista no actualizable.

Si su vista es actualizable puede basta con quitar el elemento de la definición EntitySet <DefiningQuery> para su visión dentro de la sección StorageModel de su .edm x, y el proceso de actualización normal funcionará como con cualquier otra tabla.

Si su vista no es actualizable, deberá proporcionar la actualización usted mismo a través de una "Asignación de función de modificación". El mapeo de función de modificación llama a una función definida en la sección StorageModel de su .edmx. Esa función puede contener el nombre y los argumentos a un procedimiento almacenado en su base de datos, o puede usar un "comando de definición" para escribir la inserción, actualizar o eliminar declaración directamente en la definición de función dentro de la sección StorageModel . de la .edmx" (el énfasis es mío, puesto formateado para mayor claridad y para el desbordamiento de pila)

(Fuente: "Mike" en MSDN).

+0

Gracias por la ayuda. El problema estaba en la estructura de la tabla. Después de definir una clave principal, no será una excepción. –

+3

+1 para el asesoramiento no relacionado sobre mejores prácticas (Lo malo). – Phil

+0

Confirmado, necesita un PK en su mesa (lo hará un Composite PK). Eliminar el DefiningQuery empeora las cosas. – StuartLC

0

pero puede establecer clave principal en el modelo MVC si el uso Asp.net

model.edmx Sólo tiene que abrir en su mesa, ir a su propiedad de campo y establece Entity Key = True

Cuestiones relacionadas