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

本文关键字:加载 集合 上下文 有可能 EF 是否 | 更新日期: 2023-09-27 18:06:39

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

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

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

您可以使用反射并迭代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 });
             }
         }
     }
}