【问题标题】:EF 5 - Get foreign key value for navigation propertyEF 5 - 获取导航属性的外键值
【发布时间】:2012-11-19 10:18:27
【问题描述】:

我想获取导航属性的外键值,而不必定义外键属性(在加载导航属性之前)。

为什么?

我们缓存(例如)应用程序范围内的所有“状态”对象(是的,我们不能为此使用枚举)。当我们将具有导航属性的对象加载到此状态类时,存储库会将属性设置为缓存项。

我可以使用外键属性,但由于 EF 知道该键,我想从 EF 中获取它(可能通过关系管理器或导航属性的 DBEntityReference)但我似乎找不到它。

注意:我使用的是 EF5,在 .Net 4.5 中优先编码

【问题讨论】:

  • 也许我不明白,但只是在您的实体中拥有 StatusId 属性还不够吗?
  • 可能是快捷的后备解决方案。但是,当使用外键属性 Id 时,您需要使属性和导航属性保持同步,或者找到一种方法将其从 api 中隐藏(通过使用具有访问器属性的内部类)。这一切看起来有点乱,恕我直言,这很简单。
  • 使用 EF 公开原始 FK 字段(称为 外键关联)是很常见的。 EF 在检测到更改时使它们与 FK 引用保持同步。
  • @GertArnold 仅当它们被标记为虚拟时。然后 EF 注入一个动态代理来处理这个问题。动态代理不会使用缓存的对象,而是从数据库加载。如果您不使用虚拟,则保持它们同步是您自己的责任
  • 使用代理会实时发生,否则在 DbContext.DetectChanges() 中(隐含在 SaveChanges 中)。

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


【解决方案1】:

我从Slauma 找到了一个答案(在 stackoverflow 上)(不确定我是否应该将其标记为重复?)。我不得不稍微更改代码来处理具有多个关系的实体。很多东西仍然很丑,但它有效:)

RelationshipManager relMgr = ((IObjectContextAdapter)context).ObjectContext.ObjectStateManager.GetRelationshipManager(document);
IEnumerable<IRelatedEnd> relEnds = relMgr.GetAllRelatedEnds();
IRelatedEnd relEnd = relEnds.Where(r => r.RelationshipName.EndsWith("Document_Status")).Single();
EntityReference<Status> entityRef = relEnd as EntityReference<Status>;
var entityKey = entityRef.EntityKey;

short statusId =(short)entityKey.EntityKeyValues[0].Value;

唯一的缺点是(据我所知。希望有人找到更好的方法?)一旦您分离实体或使用 AsNoTracking() 加载它,此信息就会丢失。

【讨论】:

    猜你喜欢
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 2011-08-09
    • 2016-01-09
    • 2021-11-10
    • 1970-01-01
    相关资源
    最近更新 更多