(首先是 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不想要的一些想法:
- 我可以忽略糟糕的性能并加载完整实体以获取其主键。
- 使用 [ForeignKey] 属性或 EF 的 Fluent API。但我不知道我该怎么做,或者我是否应该这样做。也许它甚至不适用于模型优先方法,因为未调用 "OnModelCreated"。
- 我修改了数据库-实体映射(edmx 代码中的 xml 内容),以便为每个外键映射一个额外的 属性 (
public int *Id {get;set;}
)。但我从来没有这样做过,也不知道从哪里开始阅读。
- 当我从我的旧数据库创建第一个 EF 6.0 模型时,有一个选项 "Include foreign key columns in the model"。上次我没有激活它,事后看来这是错误的。但是再做一遍,工作量会很大(手动设置实体继承等)。
- 使用客户经理。但是我生成的实体似乎不再实现 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;
如何在不访问导航的情况下获取外键的值属性,这样我就不需要加载完整的实体?
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不想要的一些想法:
- 我可以忽略糟糕的性能并加载完整实体以获取其主键。
- 使用 [ForeignKey] 属性或 EF 的 Fluent API。但我不知道我该怎么做,或者我是否应该这样做。也许它甚至不适用于模型优先方法,因为未调用 "OnModelCreated"。
- 我修改了数据库-实体映射(edmx 代码中的 xml 内容),以便为每个外键映射一个额外的 属性 (
public int *Id {get;set;}
)。但我从来没有这样做过,也不知道从哪里开始阅读。 - 当我从我的旧数据库创建第一个 EF 6.0 模型时,有一个选项 "Include foreign key columns in the model"。上次我没有激活它,事后看来这是错误的。但是再做一遍,工作量会很大(手动设置实体继承等)。
- 使用客户经理。但是我生成的实体似乎不再实现 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;