Mostrando entradas con la etiqueta Entity Framework. Mostrar todas las entradas
Mostrando entradas con la etiqueta Entity Framework. Mostrar todas las entradas

martes, 7 de febrero de 2017

Como recuperar un objeto de une entidad derivada en ADO.NET Entity Framework con LINQ to Entities.


Cuando tenemos una clase correspondiente a una entidad del ADO.NET Entity Framework y una o varias clases derivadas de ésta y toda la jerarquía se mapea en una sola tabla física, entonces para obtener objetos de una clase derivada mediente LINQ to Entities debemos filtrar por la clase derivada.


En el ejemplo tenemos una clase Animales que se mapea en la tabla AnimalesSet, y una clase derivada Perro. Para obtener un objeto de la clase Perro debemos hacer lo siguiente:


Código en VB.NET :
Dim queryPerro As ObjectQuery(Of Perro) =
        From animalAux As Perro In contexto.AnimalesSet.OfType(Of Perro)()
        Where animalAux.nombre = "Goofy"
        Select animalAux




lunes, 6 de julio de 2015

LINQ to Entities. Problema al utilizar entidades derivadas. LINQ to Entities sólo admite la conversión a tipos de enumeración o primitivos de EDM.


 PROBLEMA 

ERROR EN EJECUCIÓN: No se pudo convertir el tipo 'EntidadX' al tipo 'EntidadY'. LINQ to Entities sólo admite la conversión a tipos de enumeración o primitivos de EDM


Ocurre porque se intenta utilizar una entidad derivada procedente del modelo de datos EDM (cuando estamos haciendo corresponder una tabla con toda unajerarquía de entidades) y que, por tanto, no corresponde exáctamente con una conjunto de datos de nuestras tablas. En nuestro caso la entidad base es EntidadX y la entidad derivada es EntidadY. El conjunto de datos (tabla) correspondientes a las dos entidades (ya que forman una única jerarquía) sería EntidadXSet.


Se mostrará el error de arriba, si intentamos hacer esta consulta:

  Dim qElementosY As ObjectQuery(Of EntidadY) =
            From objetoY As EntidadY In context.EntidadXSet _
            Select objetoY
  Dim listado = qElementosY.ToList)



 SOLUCIÓN 

Deberemos realizar la consulta de la siguiente manera (subrayo las diferencias):


  Dim qElementosY As ObjectQuery(Of EntidadX) =
            From objetoY As EntidadX In context.EntidadXSet.OfType(Of EntidadY)() _
            Select objetoY
  Dim listado = qElementosY.ToList)




martes, 16 de diciembre de 2014

ADO.NET Entity Framework. No se guarda algún campo de una entidad dentro de una jerarquía al ejecutar el método AddObject.


 PROBLEMA 

No se guarda algún campo de una entidad que pertenece a una jerarquía de clases al ejecutar el método AddObject, sin embargo éste no da ningún error, en .NET 4.0 VS2010 con modelo de datos ADO.NET Entity Framework.


 SOLUCIÓN 

Ocurre porque las propiedades correspondientes dos clases pertenecientes a la misma jerarquía tienen valores diferentes en la propiedad ‘Acepta valores NULL’ o tienen un valor diferente que la restricción en la tabla de la base de datos.
Se resuelve unificando los valores en dicha propiedad a (ninguno) o al valor que tiene  la restricción en la tabla de la base de datos.

jueves, 14 de febrero de 2013

ADO.NET ERROR. "En EntityDataSource, se debe especificar bien Type o bien DbType ..."


 PROBLEMA 

Durante la ejecución surge el error siguiente:
En EntityDataSource, se debe especificar bien Type o bien DbType (pero no ambos) para cada Parameter.

El problema aparece al usar la propiedad Where de un EntityDataSorce,
 

 SOLUCIÓN 

Vemos en la imagen de abajo, el editor de expresiones para la propiedad Where de un EntityDataSource. En la caja de la expresión establecemos la igualdad entre el atributo ID de la Entidad con un valor idTramite pasado por parámetro. Dicho parámetro se establece con el valor de la variable de sesión IDTRAMITE. Esto se configura en la parte inferior derecha, pero nosotros no hemos indicado en ningún sitio el tipo de datos del parámetro, y esto precisamente es lo que causa el error.

Para resolver el error basta con entrar en "Mostrar propiedades avanzadas" y establecer el tipo de datos en la propiedad 'Type' con el valor que corresponda, por ejemplo, Int32.



jueves, 24 de enero de 2013

ADO.NET Entity Framework y Oracle OTN. Error en ejecución "El valor especificado no es una instancia de tipo 'Edm.Decimal'".


 PROBLEMA 

Durante la ejecución surge el error siguiente “El valor especificado no es una instancia de tipo 'Edm.Decimal'. Nombre del parámetro: value”. Sin embargo, no existe ninguna propiedad de tipo Decimal en ninguna entidad del modelo de Entity Framework.

El error es causado por una propiedad de tipo Int32 que mapea un campo de tipo NUMBER (sin especificar longitud ni escala) en la tabla correspondiente.
 

 SOLUCIÓN 

Se arregla especificando longitud y escala de forma que el tipo del campo en la tabla sea NUMBER (10,2).

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