简短的问题: 使用导航属性查找独立关联的关系名称的稳健方法是什么?
长问题:
例如,假设我有以下实体。
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.EntityB和EntityB.EntityA的 RelationshipName是相同的。我期望其他名称为“Mynamespace.EntityA_EntityB”,其他名称为“Mynamesapce.EntityB_EntityA”,但事实并非如此。此外,如果实体引用自身,则变得更加困难,例如,在这种情况下,EntityA.Parent和EntityA.Child关系的名称将是“Mynamespace.EntityA_Parent”或“Mynamespace.EntityA_Child”。
有任何想法吗?