それが可能だ。サンプルモデルでは、次の方法で外部キー値を見つけることができます。
Bbb bbb = myDbContext.Bbbs.First();
var objectContext = ((IObjectContextAdapter)myDbContext).ObjectContext;
var relMgr = objectContext.ObjectStateManager.GetRelationshipManager(bbb);
var relEnds = relMgr.GetAllRelatedEnds();
var relEnd = relEnds.Single(); // because yor model has exactly one relationship
var entityRef = relEnd as EntityReference<Aaa>;
var entityKey = entityRef.EntityKey;
int foreignKeyValue = (int)entityKey.EntityKeyValues[0].Value;
// to confirm that no database query happened
Console.WriteLine(entityRef.IsLoaded); // outputs false
クラス内に複数の関係があり、参照している複数のBbb
ナビゲーションプロパティがある場合は、列挙Aaa
内で正しい要素を見つける必要があります。relEnds
複合外部キーを持つこともできます。その場合、次のようになります。
Bbb bbb = myDbContext.Bbbs.First();
var objectContext = ((IObjectContextAdapter)myDbContext).ObjectContext;
var relMgr = objectContext.ObjectStateManager.GetRelationshipManager(bbb);
var entityRef = relMgr.GetRelatedReference<Aaa>(
"MyEntityNamespace.Bbb_MyIndependentAssociation",
"Bbb_MyIndependentAssociation_Target");
var entityKey = entityRef.EntityKey;
object[] compositeForeignKeyValues =
entityKey.EntityKeyValues.Select(e => e.Value).ToArray();
// to confirm that no database query happened
Console.WriteLine(entityRef.IsLoaded); // outputs false
これは、デバッガーでオブジェクトを検査すると、関連するオブジェクトが読み込まれる可能性があるIsLoaded
ことに注意してください(遅延読み込みが無効になっている場合でも)。true
entityRef