如何获得独立相关外键值没有击中数据库?(How to get foreign key value f

2019-09-22 05:45发布

我使用的独立协会(懒加载)来访问我的代码中第一款车型如相关实体

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从数据库实体(如在实体表调试可视化反正)。

如何获得访问值(比添加一个外键关联到我的模型等)?

Answer 1:

这是可能的。 随着你的榜样模型,你可以找到外键值的方式如下:

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

请注意, IsLoadedtrue ,如果你检查entityRef在调试对象可导致加载相关对象(即使延迟加载被禁用)。



文章来源: How to get foreign key value for independent association without hitting database?