3

コードファーストモデルで関連するエンティティにアクセスするために、独立した関連付け (遅延読み込み) を使用しています。

public class Aaa {
  public int AaaId {get;set;}
  public string SomeValue {get;set;}
}

public class Bbb {
  public int BbbId {get;set;}
  public string SomeValue {get;set;}
  public virtual Aaa MyIndependentAssociation {get;set;}
}

MyIndependentAssociationしかし、実際にレコードをロードせずに外部キー値にアクセスする方法を知りたいです。

Aaa_AaaIdデータベースからエンティティを取得するときに値が実際に読み込まれると想定してBbbいます (エンティティ テーブルのデバッグ ビジュアライザによると)。

値にアクセスするにはどうすればよいですか (外部キーの関連付けをモデルに追加する以外に)?

4

1 に答える 1

5

それが可能だ。サンプルモデルでは、次の方法で外部キー値を見つけることができます。

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ことに注意してください(遅延読み込みが無効になっている場合でも)。trueentityRef

于 2012-09-09T12:00:18.487 に答える