EF 5 - 获取导航属性的外键值

时间:2012-11-19 10:18:27

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

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

为什么吗

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

我可以使用外键属性,但由于EF知道密钥,我想从EF(可能通过RelationshipManager或导航属性的DBEntityReference)获取它,但我似乎无法找到它。

注意:我使用的是EF5,代码先于.Net 4.5

1 个答案:

答案 0 :(得分:0)

我在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()加载它,这些信息就会丢失。