如何在不打数据库的情况下获得独立关联的外键值?

时间:2012-09-08 21:12:27

标签: .net entity-framework entity-framework-5

我使用独立关联(使用延迟加载)来访问我的代码第一个模型中的相关实体,例如。

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值。

如何访问该值(除了在我的模型中添加外键关联之外)?

1 个答案:

答案 0 :(得分:4)

这是可能的。使用示例模型,您可以通过以下方式找到外键值:

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。< / p>