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

最佳答案

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

public void AttachTo(string entitySetName, Object entity)


因此,我们需要传递EntitySet名称,而不是Entity名称本身。但是好消息是,我们可以通过拥有Entity名称从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");



这样,您将构建完整的对象图。

08-06 18:54