简短的问题: 使用导航属性查找独立关联的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”。
有什么想法吗?