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…
Si tenemos una entidad relacionada con otras, o sea con una relación de conocimiento (Asociación), nos queda en nuestro modelo
donde podremos apreciar que no se encuentras las claves foráneas
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
- Asociación (EDM)
http://msdn.microsoft.com/es-es/library/bb399198.aspx - Working with Entity Keys (Entity Framework)
http://msdn.microsoft.com/es-es/library/dd283139(en-us).aspx - EntityKey.EntityKeyValues (Propiedad)
Obtiene los valores de clave asociados a esta EntityKey.http://msdn.microsoft.com/es-es/library/system.data.entitykey.entitykeyvalues.aspx
- Cómo cargar explícitamente objetos relacionados (Entity Framework)
http://msdn.microsoft.com/es-es/library/bb896249.aspx - Dar forma a los resultados de la consulta (Entity Framework)
http://msdn.microsoft.com/es-es/library/bb896272.aspx - EntityReference(TEntity).Load (Método)
Carga el objeto relacionado para esta EntityReference(TEntity). - EntityReference(Of TEntity).Load (Método) (MergeOption)
Carga el objeto relacionado para esta EntityReference(Of TEntity) con la opción de combinación especificada.
Por poner alguna cosilla más. En EF 1.0 no hay foreign keys son como se les suele llamar, asociaciones independientes, porque en realidad esas relaciones de navegación no tendrían porque existir en la base de datos. Otra alternativa, sería revisar para cada entidad sus NavigationProperties explorando el MetadataWorkspace..
Saludos
Unai
Gracias Unai
Mas info de las NavigationProperties
– NavigationProperties
http://msdn.microsoft.com/es-es/library/bb738520.aspx
– Cómo navegar por las relaciones mediante propiedades de navegación (Entity Framework)
http://msdn.microsoft.com/es-es/library/bb896321.aspx