是否可以在EF下的上下文中加载所有集合?

时间:2015-08-06 16:54:35

标签: c# entity-framework

在我的视图模型中,我有以下构造函数。

public ViewModel()
{
  Data data = new Data();

  data.Set<Stuff>().Load();
  data.Set<Things>().Load();
  ...

  Stuff = data.Set<Stuff>().Local;
  Things = data.Set<Things>().Local;
  ...
}

我理解对 Local 属性的调用是不可避免的,因为视图模型的公共属性被称为不同的名称,并且这些名称是硬编码的。但是,由于列表相当广泛,我想知道是否有办法通过在一个单一命令中执行加载来至少缩短构造函数。

我希望有这样的事情。

public ViewModel()
{
  ...
  data.AllSets.Load();
  ...
}

1 个答案:

答案 0 :(得分:0)

您可以使用反射并迭代DB-Context类的所有成员,并验证成员是否是DbSet<>的泛型类型。如果是这样,您可以执行Load()

我建议在单独的DbContext派生类中实现所述方法,例如MyDbContext : DbConbtext。也许以后我可以提供一些例子。

此处示例

public class MyDbContext : DbContext
 {
     /// <summary>
     /// Execute the 'Load' method for every DbSet<> property in the current DbContext
     /// </summary>
     public void LoadAll()
     {
         // Get all properties which should be loaded
         var propreties = typeof(FrameworkDbContext).GetProperties(BindingFlags.Instance | BindingFlags.Public)
             .Where(Item => Item.PropertyType.IsGenericType && Item.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>)).ToList();

         // Get method which will be exeecuted for every property (Extension method)
         var loadMethod = typeof(QueryableExtensions)
                              .GetMethods(BindingFlags.Static | BindingFlags.Public)
                              .Where(mi => mi.Name == "Load").FirstOrDefault(); 


         if (loadMethod != null)
         {
             foreach (var property in propreties)
             {
                 var value = property.GetValue(this);

                 // Execute load method
                 loadMethod.Invoke(value, new object[] { value });
             }
         }
     }
}