我是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'是派生类型,使用基数 改为输入。“
我知道我可以使用
为派生实体获取ObjectQueryobjectContext.CreateObjectSet<BaseType>().OfType<DerivedType>()
但是,这对获取导航属性列表没有帮助(除非我遗漏了一些东西)。我没有看到如何访问派生实体类型的EntitySet.NavigationProperties。
非常感谢任何帮助。
答案 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));
}