(首先是 EF6 模型)如何在不访问导航 属性 的情况下获取外键的值,这样我就不需要加载完整的实体?

(EF6 Model first) How can I get the value of a foreign key without accessing the navigation property so that I don't need to load the full entity?

如何在不访问导航的情况下获取外键的值属性,这样我就不需要加载完整的实体?

public class A
{
   public int Id {get;set;}
   // ...
}
public class B
{
   public virtual A A {get;set;}
   // ...
}
int idOfA = MyB.A.Id;   // slow way of doing it.

我在 VS2012 中使用 Entity Framework 6 ModelFirst+DbContext。 以前我使用旧的 EF Version+ModelFirst+ObjectContext。 我硬着头皮从旧数据库创建模型进行了迁移。

使用旧的 ObjectContext 可以获取实体键:

EntityReference<EntityType> reference = MyB.AReference; // AReference was generated by EF
int id = (int)reference.EntityKey.EntityKeyValue[0].Value;

但现在代码生成器不再为每个 One 或 ZeroOrOne 导航生成 EntityReferences 属性。

那么如何获取EF6+DbContext中的外键呢?

以下是我tried/could做但failed/didn不想要的一些想法:

  1. 我可以忽略糟糕的性能并加载完整实体以获取其主键。
  2. 使用 [ForeignKey] 属性或 EF 的 Fluent API。但我不知道我该怎么做,或者我是否应该这样做。也许它甚至不适用于模型优先方法,因为未调用 "OnModelCreated"。
  3. 我修改了数据库-实体映射(edmx 代码中的 xml 内容),以便为每个外键映射一个额外的 属性 (public int *Id {get;set;})。但我从来没有这样做过,也不知道从哪里开始阅读。
  4. 当我从我的旧数据库创建第一个 EF 6.0 模型时,有一个选项 "Include foreign key columns in the model"。上次我没有激活它,事后看来这是错误的。但是再做一遍,工作量会很大(手动设置实体继承等)。
  5. 使用客户经理。但是我生成的实体似乎不再实现 IEntityWithRelationships 接口。尽管我认为我满足 the conditions for proxies 并且我在调试器中检查了代理 类 已创建。 (编辑: 其他人对 IEntityWithRelationships+IEntitiyWithChangeTracker 也有类似的问题。See solution in the comments of this question.

这是我使用的代码(假设它不是 Model First,但是这两种方法都没有特定内容)。 在样本中我有产品,每个产品都属于一个类别。这是我如何在 Product 实体中查询 CategoryId 而无需加载 Category:

Model1 context = new Model1();
var product = context.Products.First();
RelationshipManager relMgr = ((IObjectContextAdapter)context).ObjectContext.ObjectStateManager.GetRelationshipManager(product);
IEnumerable<IRelatedEnd> relEnds = relMgr.GetAllRelatedEnds();
IRelatedEnd relEnd = relEnds.Where(r => r.RelationshipName.EndsWith("Product_Category")).Single();
EntityReference<Category> entityRef = relEnd as EntityReference<Category>;
var entityKey = entityRef.EntityKey;
int categoryId = (int)entityKey.EntityKeyValues[0].Value;