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

时间:2017-04-12 09:47:32

标签: c# .net entity-framework entity-framework-6 ef-model-first

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

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版+ 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中获取外键?

以下是我尝试/可以做但失败/不想要的一些想法:

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

1 个答案:

答案 0 :(得分:0)

这是我使用的代码(授予它不是模型优先,但它没有具体的任何方法)。 在样本中我有产品,并且每个产品属于一个类别。以下是我在CategoryId加载Product时查询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; 的方法:

explicit wait