作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用独立关联(带有延迟加载)来访问代码优先模型中的相关实体,例如
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
的外键值。
我假设当我从数据库检索 Bbb
实体时,实际加载了 Aaa_AaaId
值(无论如何,根据实体表上的调试可视化工具)。
如何访问该值(除了将外键关联添加到我的模型中之外)?
最佳答案
这是可能的。通过您的示例模型,您可以通过以下方式找到外键值:
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
请注意,如果您在调试器中检查 entityRef
对象,则 IsLoaded
可能为 true
,这可能会导致加载相关对象(即使延迟加载被禁用)。
关于.net - 如何在不打数据库的情况下获取独立关联的外键值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12334534/
我是一名优秀的程序员,十分优秀!