2016-06-22 7 views
2

я в настоящее время:Перезагрузить все связанные с ним объекты/свойства навигации с Entity Framework DbContext DbSet

context.Entry(employee).Reload(); 
context.Entry(employee).Reference(p => p.Manager).Load(); 
context.Entry(employee).Reference(p => p.Department).Load(); 

Я хочу, чтобы загрузить все связанные с ним объекты без указания их по отдельности. Что-то вроде этого было бы идеальным:

context.Entry(employee).Reload(); 
context.Entry(employee).LoadAllReferences(); 

Можно ли это сделать?

ответ

1

У нас была аналогичная проблема, когда класс сущности добавлен в коллекцию в другом классе без заданных свойств навигации, и это хранилище в общем DbContext.

Мы решили отделить объект от контекста, а затем повторный запрос в Дб, если нам нужно перезагрузить навигационные свойства (как эти решения: Force reload of entity in Entity Framework after insert/add и http://dev-doc.blogspot.co.uk/2015/09/entity-framework-reload-newly-created.html)

Вот пример кода, который мы использовали:

public class EntityRetriever 
    { 
     private readonly System.Data.Entity.DbContext _context; 

     public EntityRetriever(System.Data.Entity.DbContext context) 
     { 
      _context = context; 
     } 

     public T RetrieveEntity<T>(params object[] entityKeyValues) where T : class 
     { 

      var entity = _context.Set<T>().Find(entityKeyValues); 
      //check if is not an EF proxy class or has changed 
      if (entity != null 
       && !IsProxy(entity) 
       && _context.Entry(entity).State == System.Data.Entity.EntityState.Unchanged) 
      { 
       //This is the important part to reload navigation properties: 
       //detach entity from context and reload from db 
       _context.Entry(entity).State = System.Data.Entity.EntityState.Detached; 
       entity = _context.Set<T>().Find(entityKeyValues); 
      } 
      return entity; 
     } 

     public static bool IsProxy(object entityObject) 
     { 
      return entityObject != null && 
       System.Data.Entity.Core.Objects 
        .ObjectContext.GetObjectType(entityObject.GetType()) != entityObject.GetType(); 
     } 
    }