派生类型的实体框架导航属性

时间:2015-05-12 14:27:46

标签: c# entity-framework

我是EF的新手并且遇到了障碍。我正在尝试获取从基类型派生的实体类型的导航属性列表。我打算用....

ObjectContext objectContext = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)context).ObjectContext;
var entitySetElementType = objectContext.CreateObjectSet<DerivedType>().EntitySet.ElementType;
foreach(var navigationProperty in entitySetElementType.NavigationProperties)
{ //need PropertyInfo here}

这是我学到的,我无法获得派生类型的ObjectSet。引发的异常是

  

“没有为指定的实体类型定义EntitySet   'SurveyDALv2.Model.Correspondence'。如果   'SurveyDALv2.Model.Correspondence'是派生类型,使用基数   改为输入。“

我知道我可以使用

为派生实体获取ObjectQuery
objectContext.CreateObjectSet<BaseType>().OfType<DerivedType>()

但是,这对获取导航属性列表没有帮助(除非我遗漏了一些东西)。我没有看到如何访问派生实体类型的EntitySet.NavigationProperties。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

public EntityType ElementType(Type entityType)
{
    var type = ObjectContext.GetObjectType(entityType);
    var objectContext = ((IObjectContextAdapter)this).ObjectContext;
    EntityType elementType;
    if (objectContext.MetadataWorkspace.TryGetItem(type.FullName, DataSpace.OSpace, out elementType))
    {
        return elementType;
    }
    return null;
}

答案 1 :(得分:0)

我设法使下面的代码工作,我希望它能帮到你。

    ObjectContext objectContext = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)context).ObjectContext;
    EntityContainer container = objectContext.MetadataWorkspace.GetEntityContainer(objectContext.DefaultContainerName, DataSpace.CSpace);

    //Only works if you keep the default entity associations names pattern
    //ie: ClassName.NavigationProperty
    var t = container.AssociationSets.Where(a => a.Name.Contains(typeof(DerivedType).Name));

    foreach (AssociationSet navigationProperty in t)
    {
        String p = navigationProperty.Name;
        var propInfo = typeof(DerivedType).GetProperty(p.Substring(typeof(DerivedType).Name.Length+1));
    }