【问题标题】:Read foreign key metadata programatically with Entity Framework 4使用 Entity Framework 4 以编程方式读取外键元数据
【发布时间】:2010-12-08 04:08:06
【问题描述】:

有谁知道如何从 edmx 生成的实体框架中获取架构信息?

具体来说,我想设法遍历我目前没有实例的实体的外键并获取它的外键关系,并且我想通过反射以一种通常的方式来做到这一点每次应用于任何没有自定义代码的实体类。

EG:我的架构有 2 个类,用户和组。我知道数字“42”来自“用户”实体的“GroupId”属性,但目前我无法确定如何检测“User”外键的“GroupId”属性“Group”实体的“GroupId”属性。

【问题讨论】:

    标签: c# entity-framework-4


    【解决方案1】:

    您可以使用以下方法--

    foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name))
    foreach (var entityMember in entity.NavigationProperties)
    foreach (System.Data.Metadata.Edm.EdmProperty foreignKey in entityMember.GetDependentProperties())
    {
        //... use foreignKey
    }
    

    【讨论】:

    • 非常好 - 谢谢!我不知道如何让海报的答案起作用,但你的答案是第一次。代码示例也是 A+!
    • 太好了。尤其是因为在 Google 上找到这些东西的相关信息非常困难。
    • 这里也一样。谢谢!
    • 这在 EF6 中不起作用! ItemCollection.GetItems 非静态字段需要对象引用。
    • 对于 EF 6,您可以在 post 中看到我的答案
    【解决方案2】:

    最终找到了解决方案。相关信息可以在上下文的RelationshipManager 属性中找到。通过调用GetAllRelatedEnds(),然后找到AssociationSet 类型的那些。

    然后,关联集的ElementType 包含一个IsForeignKey 属性和一个数组ReferentialConstraints,该数组分别具有每个约束ToRoleToPropertyFromRoleFromProperty 的属性,并且RelationshipMultiplicity上的ToRole/FromRole可以用来判断外键关系的方向。

    获取所有这些数据并使用上下文的 GetObjectByKey 方法,我能够以编程方式遍历为上下文定义的外键关系,而无需关联实体。

    【讨论】:

    • 我无法让它工作。我在上下文中找不到RelationshipManager 属性(尽管我可以通过CType(tableObject, IEntityWithRelationships).RelationshipManager 获取它),然后在执行此操作后我无法从GetRelatedEnds 中找到可以转换为AssociationSet 的结果。一个代码示例将不胜感激。
    • 嘿,很抱歉延迟回复 - 我很长时间没有读到这个了。我应该更清楚的是,我是在 ObjectStateEntry 中工作,而不是直接从 Context 中工作。我从那里使用的确切语法是“foreach (AssociationSet assoc in ose.RelationshipManager.GetAllRelatedEnds().Select(end => end.RelationshipSet).Where(rs => rs is AssociationSet && ((AssociationSet)rs).ElementType。 IsForeignKey).Cast())”,然后我有一些额外的逻辑来确定它在哪一边,因为我只想要特定的外键多重性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2013-03-21
    • 2011-01-28
    • 1970-01-01
    相关资源
    最近更新 更多