3

简短的问题: 使用导航属性查找独立关联的关系名称的稳健方法是什么?

长问题:

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

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 访问它们(如此处所示)。

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 的正确方法是什么,即我想要一个可以使用的方法,例如:

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

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

有任何想法吗?

4

0 回答 0