C# 派生类型上的实体框架导航属性
我是EF的新手,遇到了一个障碍。我试图获取从基类型派生的实体类型的导航属性列表。我打算用C# 派生类型上的实体框架导航属性,c#,entity-framework,C#,Entity Framework,我是EF的新手,遇到了一个障碍。我试图获取从基类型派生的实体类型的导航属性列表。我打算用 ObjectContext objectContext = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)context).ObjectContext; var entitySetElementType = objectContext.CreateObjectSet<DerivedType>().EntitySet.Eleme
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}
ObjectContext ObjectContext=((System.Data.Entity.Infrastructure.IOObjectContextAdapter)上下文);
var entitySetElementType=objectContext.CreateObjectSet().EntitySet.ElementType;
foreach(entitySetElementType.NavigationProperties中的var navigationProperty)
{//此处需要PropertyInfo}
这就是我学到的无法获取派生类型的ObjectSet的地方。引发的异常是
“没有为指定的实体类型定义EntitySet
“SurveyDALv2.模型.对应关系”。如果
“SurveyDALv2.Model.correctification”是派生类型,请使用基
改为键入。”
我知道我可以使用
objectContext.CreateObjectSet<BaseType>().OfType<DerivedType>()
类型()的objectContext.CreateObjectSet()
但,这无助于获取导航属性列表(除非我遗漏了什么)。我看不到如何访问派生实体类型的EntitySet.NavigationProperties
非常感谢您的帮助。我成功地使以下代码正常工作,希望它能帮助您
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));
}
从未在核心上下文中尝试过,但您可以尝试以下操作:
CreateObjectSet().OfType()
而不是CreateObjectSet()
?谢谢,但我正在查找在派生类型实体上定义的导航属性列表。这(适用于获取导航属性列表,除非它是派生类型实体)(marsman的答案)这似乎适用于我的大多数实体类,但我有一些扩展其他实体名称的实体名称。我有一个通信类和通信链类,以及通信链项类。所以我的类名阻止了“Where”(a=>a.Name.Contains'仅返回正确的关联集。t这确实有帮助。我只是尝试在添加和保存更改之前发现实体的导航属性并将其重新附加到上下文中。添加时,我得到了重复的实体,因为我使用的是分离的上下文。我只是想我知道存在一些类型特定的东西来附加导航属性。谢谢考虑到您的类名,您可以使用类似于Where(a=>a.Name.Contains(typeof(DerivedType.Name+))的东西
注意:
可能已被字符串中的\uu
替换。无论如何,如果复制实体时出现问题,则可能无法正确检索实体(包括延迟加载)我猜您没有将FK属性添加到模型中,从而允许您根据已知的FK加载导航属性。这里总结了我遇到的问题,我正在从access db迁移数据。我将改为使用FK属性分配导航属性,这样可以防止重复。感谢您的帮助。
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;
}