我正在尝试从我的上下文执行LoadProperty操作以加载导航属性的导航属性。
我的设置是我有一个EntityA,其中包含EntityB的列表,每个EntityB包含一个EntityC列表。我正在以编程方式执行以下操作:
public virtual List<T> LoadProperty(List<T> entities, string property)
{
using (MyContext context = new MyContext())
foreach (T entity in entities)
{
context.AttachTo(typeof(T).Name, entity);
context.LoadProperty(entity, property);
}
return entities;
}
我称之为:
LoadProperty(entityA, "EntityB.EntityC");
我知道NavigationProperty路径是正确的,但是,这不起作用。有没有办法让它加载?
编辑: 使用包含的工作示例:
using (MyContext context = new MyContext())
{
var query = from entityA in context.EntityA.Include("EntityB").Include("EntityB.EntityC")
where entityA.Id == id
select entityA;
return query.ToList();
}
答案 0 :(得分:1)
“我知道NavigationProperty路径是正确的......”不,不是。没有列表,它不是。尝试使用常规Include
,您会看到相同的结果。您无法使用1:*属性执行此操作。
我无法想象这是解决您问题的最有效方法,但您实际上并没有说明您认为自己需要这个问题的原因。
答案 1 :(得分:1)
首先,您的方法调用 context.AttachTo(typeof(T).Name,entity)不正确,您将获得InvalidOperationException。 ObjectContext.AttachTo Method显示:
public void AttachTo(string entitySetName, Object entity)
因此我们需要传递EntitySet名称而不是实体名称本身。但好消息是我们可以通过拥有实体名称从 MetadataWorkspace 获取EntitySet名称。下面的代码显示了如何。
现在,如果你有3个对象组合级别,而EntityB和EntityC是EntityCollections类型的导航属性,那么我认为你不能通过一次调用LoadProperty来加载它们,但你可以通过调用LoadProperty两次来完成它,这是如何做到的:
using System.Data.Metadata.Edm;
public virtual List<T> LoadProperty(List<T> entities, string property) {
using (TrialsContext context = new TrialsContext()) {
EntityContainer container = context.MetadataWorkspace
.GetEntityContainer(context.DefaultContainerName,
DataSpace.CSpace);
EntitySetBase entitySet = container.BaseEntitySets
.Where(item =>
item.ElementType.Name.Equals(typeof(T).Name))
.FirstOrDefault();
foreach (T entity in entities) {
context.AttachTo(entitySet.Name, entity);
context.LoadProperty(entity, property);
}
return entities;
}
你会称之为:
// To load EntityA Nav property:
LoadProperty(entityB, "EntityA");
// To Load EntityC Nav property:
//Let's assume the nav property name for EntityC on EntityB is EntityCList
LoadProperty(entityB, "EntityCList");
这样你就可以构建完整的对象图。