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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实体框架检查属性是否为导航属性相关的知识,希望对你有一定的参考价值。

有没有办法从其元数据中查看实体的属性是否为导航属性?

我可以通过检查属性是否实现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);
}
另一答案

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

Obs:found变量是一些DbContext实体实例;

foreach (var propertyInfo in found.GetType().GetProperties())
{
    var reference = Context.Entry(found).Member(propertyInfo.Name) as DbReferenceEntry;

    if (reference != null)
    {
        reference.Load();
    }
}

以上是关于实体框架检查属性是否为导航属性的主要内容,如果未能解决你的问题,请参考以下文章

实体框架 CTP5,代码优先。可选的导航属性

如何首先使用实体​​框架 5 代码删除具有导航属性的对象?

当延迟加载禁用时,如何通过实体框架仅将导航属性的特定属性包含到查询中?

如何使用代码优先实体框架在 ASP.Net MVC3 中重新加载多对多导航属性

实体框架代码优先导航问题

使用实体框架的导航属性的有意义的名称