在运行时,我想查找一个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 "";
}
我认为你可以直接到达NavigationProperties的EntitySet.ElementType.NavigationProperties而不必过滤所有成员。 – 2015-01-13 08:51:09