繁体   English   中英

EF 4.0 - 导航属性的加载导航属性

[英]EF 4.0 - Load Navigation Property of Navigation Property

我试图从我的上下文执行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();
}

“我知道NavigationProperty路径是正确的......”不,不是。 没有列表,它不是。 尝试使用常规Include ,您将看到相同的结果。 您无法使用1:*属性执行此操作。

我无法想象这是解决您问题的最有效方法,但您实际上并没有说明为什么您认为自己需要这个问题。

首先,您的方法调用context.AttachTo(typeof(T).Name,entity)不正确,您将获得InvalidOperationException。 ObjectContext.AttachTo方法显示:

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");

这样您就可以构建完整的对象图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM