martes, 2 de octubre de 2012

ADO.NET Entity Framework. Error "... mientras se actualizaban las entradas." debido a problema en la propiedad StoreGeneratedPattern


 PROBLEMA 

Se produce el error de abajo al depurar una aplicación .NET 4.0 VS2010 con modelo de datos ADO.NET Entity Framework, teniendo un atributo clave de entidad con la propiedad StoreGeneratedPattern con valor "Identity". Utilizamos StoreGeneratedPattern= "Identity" cuando dicho atributo clave se mapea con un campo de la tabla definido como clave primaria y que cuyo valor se establece automáticamente mediante un trigger en la base de datos. Por lo que no deseamos que el modelo ADO.NET establezca el valor del atributo.

System.ServiceModel lanza la siguiente excepción:
"Se produjo un error mientras se actualizaban las entradas. Vea la excepción interna para obtener detalles."

 SOLUCIÓN 

Parece que se debe a un defecto bug en el ADO.NET Entity Framework.

El problema radica en que el diseñador de modelos Entity Framework no establece automáticamente la propiedad StoreGeneratedPattern= "Identity" en la sección del modelo de almacenamiento (SSDL) mientras que sí lo hace en el modelo conceptual (CSDL). Esto se puede comprobar y corregir en el archivo EDMX del modelo, editándolo con el editor de xml.

En el siguiente ejemplo observamos como en el diseñador de modelos hemos establecido el atributo id de la entidad TarjetaMovil con la propiedad StoreGeneratedPattern= "Identity".


Si editamos el archivo .edmx correspondiente a dicho modelo observarermos los siguiente, siendo TEL_TARJETAS_MOVIL la tabla que se asigna a la entidad TarjetaMovil. La definicion de StoreGeneratedPattern aparece en su sitio en el modelo CSDL pero no en el modelo SSDL.
 
<edmx:StorageModels>
        .....
<EntityType Name="TEL_TARJETAS_MOVIL">
<Key><PropertyRef Name="ID" /></Key>
<Property Name="ID" Type="number" Nullable="false" />
        .....
        .....
<edmx:ConceptualModels>
<Key><PropertyRef Name="id" /></Key>
<EntityType Name="TarjetaMovil">
        .....
<Property Type="Int32" Name="id" Nullable="false" annotation:StoreGeneratedPattern="Identity" >


Para resolver el problema bastará con añadir StoreGeneratedPattern="Identity" (ATENCIÓN: sin incluir annotation:) en el lugar correspondiente del modelo de almacenamiento como se ve a continuación:

<edmx:StorageModels>
        .....
<EntityType Name="TEL_TARJETAS_MOVIL">
<Key><PropertyRef Name="ID" /></Key>
<Property Name="ID" Type="number" Nullable="false" StoreGeneratedPattern="Identity" />


8 comentarios:

  1. Me pasaba este error y este blog me ha ayudado mucho, me volvio loco un par de horas como mínimo. Gracias por la ayuda encontrada. ;)

    ResponderEliminar
  2. Me alegro, por cierto, ten en cuenta que cada vez que regeneres el modelo a partir de la base de datos tendrás que volver a hacerlo.

    ResponderEliminar
  3. Hice esto, pero me sigue apareciendo el error. ¿Alguien tiene idea de por qué? Muchas gracias

    ResponderEliminar
  4. Saben si aun no se ha dado solucion a este bug?

    ResponderEliminar
  5. MICROSOFT HIJODEPUTA NUNCA MAS EN MI VIDA ESCRIBO UNA TECLA EN VISUAL
    GRACIAS POR LAS 15 HORAS PERDIDAS EN ESTO
    GRACIAS POR SER TAN MANCO

    ResponderEliminar
  6. Espero que esto me funcione si es asi luego publico

    ResponderEliminar
  7. Ya probaste que tu registro que deseas eliminar no sea utilizado como fk en alguna otra tabla
    tal vez sea ese el problema (a mi me paso)

    ResponderEliminar
  8. Cordial saludo. Al tratar de ingresar un alumno me muestra el siguiente error:

    Error al registrar al alumno- Se produjo un error mientras se actualizaban las entradas. Vea la excepción interna para obtener detalles.

    Muchas gracias por la orientación. Estoy trabajando con Visual Básic .Net 2017 y la Sql Server 2017.

    ResponderEliminar