2011-02-13 136 views
2

在运行时,我想查找一个EntityObject是否也有给定NavigationProperty的外键属性。我有以下两个步骤。我想这将需要一些元数据查询。查找导航属性的相关FK属性

我不确定如何测试元数据类是否指向特定EntityObject类型的类型:即,我概念性地知道EntityType实例和EntityObject实例之间的关系,但不是程序化的。

到目前为止,我有:

/*puesdo code class representing edm example*/ 
    class Possesion: EntityObject 
    { 

     //Nav prop 
     public Person Owner { get; set; } 

     //related FK prop 
     public int OwnerId { get; set; } 

    } 

    public static NavigationProperty GetNavigationProperty<TObjectContext, T>(
     this ObjectContext context, 
     Expression<Func<T, Object>> targetProperty) 
     where TObjectContext : ObjectContext 
    { 
     //eg: possession => possession.Owner property type would be person 
     PropertyInfo targetProp = GetPropertyType(targetProperty); 
     //target type would be Possesion 
     Type targetType = targetProp.DeclaringType; 

     var containerName = context.DefaultContainerName; 
     var model = DataSpace.CSpace; 
     var workspace = context.MetadataWorkspace; 
     var container = workspace.GetEntityContainer(containerName, model); 

     EntitySetBase entitySet = container.BaseEntitySets 
      .Where(e => e.Name == context.GetEntitySetNameFromType(targetType)) 
      .FirstOrDefault(); 

     if (entitySet == null) 
      return null; 

     //materialize nav props for testing 
     var navigationProps = entitySet.ElementType.Members 
      .Where(m => m.BuiltInTypeKind == BuiltInTypeKind.NavigationProperty 
      ) 
      .Cast<NavigationProperty>() 
      .ToList(); 

     //The question: how to filter the nav props for that which pertains 
     // to the target property? 
     NavigationProperty navProp = navigationProps 
      .Where(
      //how do we select the nav property based on the Passed EntityObject's type 
      //ie how to we link the Metadata type to the concrete type?? 
      n => n.FromEndMember.TypeUsage.???????? == targetProp.PropertyType) 
      .FirstOrDefault(); 


     return navProp; 
    } 

    public static String GetPossibleFKPropertyName(Type entityObjectType, NavigationProperty property) 
    { 
     //Check each end for the target type 
     //with this end ie To or From, determine if there is a Property on the entityObject that equated to the PropertyRef column 
     //return this. 

     var toEnd = property.ToEndMember.GetEntityType(); 
     //Again how do I determine that the Person metadata is a Person EntityObjectType? 
     if (toEnd.SomeTypeMember???? == entityObjectType) 
      return toEnd.KeyMembers[0].Name; //Testing HACK, return name for now. 

     var fromEnd = property.FromEndMember.GetEntityType(); 
     if (fromEnd.SomeTypeMember???? == entityObjectType) 
      return fromEnd.KeyMembers[0].Name; 

     return ""; 

    } 
+0

我认为你可以直接到达NavigationProperties的EntitySet.ElementType.NavigationProperties而不必过滤所有成员。 – 2015-01-13 08:51:09

回答

2

最后我简单地做对的的ElementType

即全名文本比较:

n =>((RefType)n.ToEndMember.TypeUsage.EdmType).ElementType.FullName 
           == targetProp.PropertyType.FullName) 

也ToEnd是财产我我的目标是那么一旦我有了NavigationProperty,呼叫GetDependentProperties()似乎产生了我在作为FK属性名称之后,即:

public static String GetFKPropertyName(this NavigationProperty property) 
    { 
     var depProp = property.GetDependentProperties().FirstOrDefault(); 

     if (depProp == null) 
      return ""; 

     return depProp.Name; 

    } 
+0

我正在寻找`GetDependentProperties`方法谢谢。 – 2015-01-13 08:54:30