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 回答