使用Entity Framework DbContext DbSet重新加载所有相关对象/导航属性

时间:2016-06-22 03:30:19

标签: 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 个答案:

答案 0 :(得分:1)

我们遇到了类似的问题,其中实体类被添加到另一个类中的集合中,而没有设置导航属性,而是存储在共享的DbContext中。

我们决定将实体与上下文分离,然后在我们需要重新加载导航属性时重新查询Db(如这些解决方案:Force reload of entity in Entity Framework after insert/addhttp://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();
        }
    }