我正在使用独立关联(带有延迟加载)来访问代码优先模型中的相关实体,例如
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
当我检索 a 时,值实际上已加载Bbb
来自数据库的实体(无论如何根据实体表上的调试可视化工具)。
如何访问该值(除了将外键关联添加到我的模型中之外)?
这是可能的。通过示例模型,您可以通过以下方式找到外键值:
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
can be true
如果你检查entityRef
调试器中的对象可能会导致加载相关对象(即使禁用延迟加载)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)