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"
/>