3

短い質問: ナビゲーション プロパティを使用して独立した関連付けの 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; }
}

すべての関連付けは 1 対 1 の独立した関連付けであるため、明示的な外部キーはありません。ただし、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 でフィルター処理する必要があります。今、エンティティの実際のナビゲーション プロパティに基づいて RelationshipName を取得する適切な方法は何だろうと思っています。つまり、次のように使用できるメソッドが必要です。

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

問題の 1 つは、EntityA.EntityBEntityB.EntityAの RelationshipNameが同じであることです。私は他の名前が「Mynamespace.EntityA_EntityB」であり、他の名前が「Mynamesapce.EntityB_EntityA」であることを期待していましたが、そうではありません。また、エンティティがそれ自体を参照している場合はさらに難しくなります。たとえば、この場合、EntityA.ParentEntityA.Childの両方の関係の名前は、"Mynamespace.EntityA_Parent" または "Mynamespace.EntityA_Child" のいずれかになります。

何か案は?

4

0 に答える 0