如何获取NavigationName的导航属性?

时间:2013-07-22 14:33:31

标签: c# .net entity-framework

简短的问题: 使用导航属性查找独立关联的RelationshipName的有效方法是什么?

长问题:

例如,假设我有以下实体。

public class EntityA
{
    public EntityA Parent { get; set; }
    public EntityA Child { get; set; }

    public EntityB EntityB { get; set; }
}

public class EntityB
{
    public EntityA EntityA { get; set; }
}

所有关联都是一对一的独立关联,因此没有明确的外键。但是,EntityFramework在内部存储外键,我应该可以使用RelationshipManager(as shown here)来访问它们。

EntityA myEntity = ...;

var ctx = ((IObjectContextAdapter)dbContext).ObjectContext;
RelationshipManager relMgr = ctx.ObjectStateManager.GetRelationshipManager(myEntity);
IEnumerable<IRelatedEnd> relEnds = relMgr.GetAllRelatedEnds();

var reference = (EntityReference)relEnds.Where(x => x.RelationshipName == "Mynamespace.EntityA_EntityB").FirstOrDefault();
var foreignKey = (Int64)reference.EntityKey.EntityKeyValues[0].Value;

基本上这个方法要求我获得实体拥有的所有关系,并通过RelationshipName过滤它们。现在我想知道根据实体的实际导航属性获取RelationshipName的正确方法是什么,即我希望有一个我可以使用的方法:

// How do I write "GetRelationshipName" method?
string relationshipName = GetRelationshipName<EntityA>(a => a.EntityB);
var reference = relEnds.Where(x => x.RelationshipName == relationshipName).FirstOrDefault();

其中一个问题似乎是 EntityA.EntityB EntityB.EntityA 的RelationshipName是相同的。我期待其他名称是“Mynamespace.EntityA_EntityB”,而其他名称则是“Mynamesapce.EntityB_EntityA”但事实并非如此。而且,如果实体引用自身,则变得更加困难,例如,在这种情况下, EntityA.Parent EntityA.Child 这两个关系的名称将是“Mynamespace.EntityA_Parent”或“Mynamespace.EntityA_Child”。

有什么想法吗?

0 个答案:

没有答案