gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:36:01 24 4
gpt4 key购买 nike

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

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 属性是不可避免的,因为 View 模型的公共(public)属性被称为不同的名称,并且这些是硬编码的。但是,由于列表相当广泛,我想知道是否有一种方法可以通过在一个单一命令中执行加载来至少缩短构造函数。

我希望有这样的东西。

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

最佳答案

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

关于c# - 是否可以在 EF 下加载上下文中的所有集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31861560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com