Entity framework 使用实体框架DbContext DbSet重新加载所有相关对象/导航属性

Entity framework 使用实体框架DbContext DbSet重新加载所有相关对象/导航属性,entity-framework,dbcontext,dbset,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(empl

我目前有:

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

可以这样做吗?

我们遇到了一个类似的问题,在没有设置导航属性的情况下,将实体类添加到另一个类的集合中,并且该实体类存储在共享的DbContext中

我们决定从上下文中分离实体,然后在需要重新加载导航属性时重新查询数据库(如以下解决方案:和)

下面是我们使用的代码示例:

   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();
        }
    }
公共类EntityRetriever
{
私有只读System.Data.Entity.DbContext\u context;
公共EntityRetriever(System.Data.Entity.DbContext上下文)
{
_上下文=上下文;
}
公共T RetrieveEntity(参数对象[]entityKeyValues),其中T:class
{
var entity=_context.Set().Find(entityKeyValues);
//检查是否不是EF代理类或是否已更改
如果(实体!=null
&&!IsProxy(实体)
&&_context.Entry(entity.State==System.Data.entity.EntityState.Unchanged)
{
//这是重新加载导航属性的重要部分:
//从上下文中分离实体并从数据库中重新加载
_context.Entry(entity.State=System.Data.entity.EntityState.Detached;
实体=_context.Set().Find(entityKeyValues);
}
返回实体;
}
公共静态bool IsProxy(对象entityObject)
{
返回entityObject!=null&&
System.Data.Entity.Core.Objects
.ObjectContext.GetObjectType(entityObject.GetType())!=entityObject.GetType();
}
}