Entity framework 4 实体框架检查属性是否为导航属性

Entity framework 4 实体框架检查属性是否为导航属性,entity-framework-4,properties,Entity Framework 4,Properties,是否有任何方法可以从其元数据中查看实体的属性是否为导航属性 我可以通过检查属性是否实现ICollection来确定它是否为实体集合,并从中得出它是否为导航属性的结论 但是,如果属性不是实体集合,而只是对另一个实体的引用,该怎么办?您可以从MetdataWorkspace获取O-Space EDM实体类型,并且它具有NavigationProperties属性。以下是一个例子: var workspace = ((IObjectContextAdapter) ctx).ObjectContext.

是否有任何方法可以从其元数据中查看实体的属性是否为导航属性

我可以通过检查属性是否实现ICollection来确定它是否为实体集合,并从中得出它是否为导航属性的结论


但是,如果属性不是实体集合,而只是对另一个实体的引用,该怎么办?

您可以从MetdataWorkspace获取O-Space EDM实体类型,并且它具有NavigationProperties属性。以下是一个例子:

var workspace = ((IObjectContextAdapter) ctx).ObjectContext.MetadataWorkspace;
var itemCollection = (ObjectItemCollection)(workspace.GetItemCollection(DataSpace.OSpace));
var entityType = itemCollection.OfType<EntityType>().Single(e => itemCollection.GetClrType(e) == typeof(MyEntity));
foreach(var navigationProperty in entityType.NavigationProperties)
{
    Console.WriteLine(navigationProperty.Name);
}
var-workspace=((IObjectContextAdapter)ctx).ObjectContext.MetadataWorkspace;
var itemCollection=(ObjectItemCollection)(workspace.GetItemCollection(DataSpace.OSpace));
var entityType=itemCollection.OfType().Single(e=>itemCollection.GetClrType(e)=typeof(MyEntity));
foreach(entityType.NavigationProperties中的var navigationProperty)
{
Console.WriteLine(navigationProperty.Name);
}

您可以使用另一种方法来解决问题

Obs:
found
变量是某个DbContext实体实例

foreach(found.GetType().GetProperties()中的var propertyInfo)
{
var reference=Context.Entry(found).Member(propertyInfo.Name)作为DbReferenceEntry;
如果(引用!=null)
{
reference.Load();
}
}

让每个实体实现一个AbstractEntity并进行(entity is AbstractEntity)检查?是的,这似乎可以解决问题,但我没有找到为特定实体实例化system.data.metadata.edm.entitytype的方法。它的构造函数是无参数的,在静态方法中也没有任何东西。本例中的ctx是DbContext。如果不使用CodeFirst,则不需要IOObjectContextAdPath-MetadataWorkspace属性将直接位于您的上下文(从ObjectContext派生)是。第1行,IObjectContextAdapter用于EF6,无法在vs2010 EF4中编译。因此,我将第1行更改为:NorthwindEntities en=new NorthwindEntities();var workspace=en.MetadataWorkspace;(对吗?)。然后运行,在第3行中,exception:Sequence不包含匹配的元素(我已将MyEntity替换为Employee),您可以使用以下代码:
foreach(itemCollection.OfType()中的var e){Console.WriteLine('{0},{1}',e.FullName,itemCollection.GetClrType(e.FullName);}
转储您拥有的实体及其对应的clr类型。这将为您提供如何映射CLR类型的线索。itemCollection包含许多基本类型,如int、string等,但不包含EntityType类型。