[EF 1.0] Obtener la foreign key de una entidad (que no la tenemos por intellisense)

El que esta trabajando con Entity Framework 1.0 (para VS2008 SP1)… sabrá que:

Cuando creamos el modelo las foreign keys las utiliza para crear las relaciones, y mediante propiedades navegar entre ellas. O sea no necesitaríamos las FK para nada, porque es algo que la DB necesita para relaciones (“larga vida a las base de datos relacionales”)

Esta particularidad de no visualizar las claves foráneas me parece muy bueno, ya que no la necesitamos en POO

NOTA Adjunta: en EF 4.0 (que seria la 2.0 pero la versión sigue a la del Framework .NET) al momento de generar el modelo pregunta si queremos “visualizar las foreign keys” :)

 

A través de una pregunta en los newsgroups y foros (que mas bien me vino por email) necesitaban si o si desesperadamente el identificador de la foránea, así que lo dejo por aquí para referencia.

 

Pensamiento lateral: (pensando pensando.. en que momento utilizar esto) Se me ocurre cuando estamos visualizando en una pagina ASP.NET y queremos ver el detalle de algo adjunto o enviarlo a una función javascript seria necesario ir a las clave foránea, en vez de traer la entidad relacionada. Caso claro es las grillas donde por alguna razón tenemos que visualizar una imagen asociada y deseamos enviar el id al handler que despliega la misma. (Esto es solo un pensamiento en voz alta)

 

Veamos lo que necesitamos…

En la DB la tabla que mapeamos…

image

Si tenemos una entidad relacionada con otras, o sea con una relación de conocimiento (Asociación), nos queda en nuestro modelo

image

donde podremos apreciar que no se encuentras las claves foráneas

image

 

Pero si no puedes dormir sin esta información…

 

Como lo obtenemos?

Opción recomendada utilizando elegantemente expresiones lambda, y buscamos el nombre de la clave foránea que tanto deseamos:

En VB.NET

Dim tipoPublicidadId As Int32 = Int32.Parse(publicidadArchivo.TipoPublicidadReference.EntityKey.EntityKeyValues.First(Function(k) k.Key = "TipoPublicidadId").Value)

 

En C#

int tipoPublicidadId = (int)publicidadArchivo.TipoPublicidadReference.EntityKey.EntityKeyValues.First(k => k.Key == "TipoPublicidadId").Value;

 

Podemos por índice…, algo que nunca me gusto utilizar “índices” (vaya uno a saber en que posición se encuentra la que necesitamos,… pero igualmente va el código

En VB.NET

Dim tipoPublicidadId As Int32
If publicidadArchivo.TipoPublicidadReference.EntityKey IsNot Nothing Then 
     tipoPublicidadId = Int32.Parse(publicidadArchivo.TipoPublicidadReference.EntityKey.EntityKeyValues(0).Value) 
End If

EN C#

int tipoPublicidadId;
if (!IsNothing(publicidadArchivo.TipoPublicidadReference.EntityKey)) {
    tipoPublicidadId = Int32.Parse(publicidadArchivo.TipoPublicidadReference.EntityKey.EntityKeyValues(0).Value);
}

 

Cuando se cargan?

Las asociaciones se cargan y completan cuando hacemos Include en la consulta LINQ to Entities relacionada, o la carga explicita con mediante el método Load

NOTA: Hasta EF 4.0 no tenemos Lazy Load “nativo”.

 

 

Enlaces

Crossposting desde mi blog en Geeks.ms: http://geeks.ms/blogs/fernandezja

Published 01-13-2010 21:10 por Jose A. Fernandez