【问题标题】:entity framework check if property is navigation property实体框架检查属性是否为导航属性
【发布时间】:2021-07-27 00:11:54
【问题描述】:

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

我可以通过检查它是否实现 ICollection 来确定属性是否是实体集合,并从那里我可以断定它是否是导航属性。

但是如果属性不是实体集合而只是引用另一个实体呢?

【问题讨论】:

  • 让每个实体实现一个AbstractEntity并做一个(实体是AbstractEntity)检查?

标签: entity-framework-4 properties


【解决方案1】:

您可以从 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);
}

【讨论】:

  • 是的,这似乎可以解决问题,但我没有找到为特定实体实例化 system.data.metadata.edm.entitytype 的方法。它的构造函数是无参数的,静态方法之间也没有。
  • 我添加了一些代码来展示如何做到这一点。在这种情况下,ctx 是 DbContext。如果您不使用 CodeFirst,则不需要 IObjectContextAdpater - MetadataWorkspace 属性将直接在您的上下文中(派生自 ObjectContext)
  • 是的。第 1 行,IObjectContextAdapter 用于 EF6,无法在 vs2010、EF4 中编译。所以我把第一行改成:NorthwindEntities en = new NorthwindEntities();var workspace = en.MetadataWorkspace;(是不是?)。然后运行并在您的第 3 行中,异常:序列不包含匹配元素(我已将您的 MyEntity 替换为 Employee)
  • 您可以使用以下代码:foreach(var e in itemCollection.OfType&lt;EntityType&gt;()) { Console.WriteLine('{0}, {1}', e.FullName, itemCollection.GetClrType(e).FullName); } 转储您拥有的实体以及它们对应的 clr 类型。这应该可以让您了解如何映射 CLR 类型。
  • itemCollection 包含许多基本类型,例如 int、string 等,但没有 EntityType 类型。
【解决方案2】:

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

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();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    相关资源
    最近更新 更多