2010-12-08 13 views
7

¿Alguien sabe cómo obtener la información de esquema de un Entity Framework generado por edmx?Lea metadatos de claves externas de forma programática con Entity Framework 4

Específicamente quiero administrar atravesar la clave externa para una entidad que actualmente no tengo una instancia de y obtener sus relaciones de clave externa, y quiero hacerlo a través de la reflexión de una manera que será genéricamente aplicado a cualquier clase de entidad sin código personalizado cada vez.

EG: Mi esquema tiene 2 clases, Usuario y Grupo. Tengo el número "42" que sé que proviene de la propiedad "GroupId" de una entidad "Usuario", pero por el momento no puedo encontrar la manera de detectar que esta propiedad "GroupId" de las claves externas "Usuario" la entidad "Group" por su propiedad "GroupId".

Respuesta

7

Terminé encontrando la solución a esto. La información relevante se puede encontrar en la propiedad RelationshipManager del contexto. Llamando al GetAllRelatedEnds() y luego encontrando los del tipo AssociationSet.

El ElementType de la asociación se establece a continuación contiene una IsForeignKey propiedad y también una matriz ReferentialConstraints que tiene propiedades para cada restricción ToRole, ToProperty, FromRole y FromProperty respectivamente, y la RelationshipMultiplicity en la ToRole/FromRole se pueden utilizar para determinar la dirección de la relación de clave extranjera.

Tomando todos estos datos y usando el método GetObjectByKey del contexto pude recorrer mediante programación las relaciones de clave foránea definidas para un contexto sin tener la entidad asociada.

+1

no pude conseguir que esto funcione. No pude encontrar una propiedad de RelationshipManager en el contexto (aunque puedo obtenerla mediante CType (tableObject, IEntityWithRelationships) .RelationshipManager), y luego de hacer eso no pude encontrar los resultados de GetRelatedEnds que podrían enviarse a AssociationSet. Un ejemplo de código sería muy apreciado. – pbarranis

+1

Oye, me disculpo por la respuesta tardía. No había leído esto en mucho tiempo. Debería haber sido más claro que estaba trabajando desde un ObjectStateEntry en lugar de directamente desde el Contexto. La sintaxis exacta que utilicé desde allí fue "foreach (AssociationSet assoc in ose.RelationshipManager.GetAllRelatedEnds(). Select (end => end.RelationshipSet) .Where (rs => rs es AssociationSet && ((AssociationSet) rs) .ElementType. IsForeignKey) .Cast ()) ", luego tuve una lógica adicional para averiguar de qué lado estaba porque yo solo quería multiplicidades específicas de claves externas. – fyjham

21

Puede utilizar el siguiente enfoque -

foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name)) 
foreach (var entityMember in entity.NavigationProperties) 
foreach (System.Data.Metadata.Edm.EdmProperty foreignKey in entityMember.GetDependentProperties()) 
{ 
    //... use foreignKey 
} 
+2

Excelente, ¡gracias! No sé cómo hacer que la respuesta del póster funcione, pero la tuya funcionó la primera vez. A + para el ejemplo del código también! – pbarranis

+2

Simplemente genial. No menos importante porque encontrar información relevante para este material en Google es extremadamente difícil. –

+0

Lo mismo aquí. ¡Gracias! –

Cuestiones relacionadas