检查 DbSet<T> 是否为空

Col*_*ett 3 .net c# generics entity-framework entity-framework-core

我正在研究一种从 json 为 EF Core 数据库做种的方法。因此,我有一系列方法可以像下面那样为每个实体(FilterList并且Language是两个示例实体)发挥作用。除了名称、dbset 属性名称和实体类型的两个实例之外,这些方法都是相同的。

private static void SeedFilterLists(FilterListsDbContext context)
{
    if (context.FilterLists.Any()) return;
    var types = JsonConvert.DeserializeObject<List<FilterList>>(
        File.ReadAllText(SeedDirectory + Path.DirectorySeparatorChar + typeof(FilterList).Name + ".json"));
    context.AddRange(types);
    context.SaveChanges();
}

private static void SeedLanguages(FilterListsDbContext context)
{
    if (context.Languages.Any()) return;
    var types = JsonConvert.DeserializeObject<List<Language>>(
        File.ReadAllText(SeedDirectory + Path.DirectorySeparatorChar + typeof(Language).Name + ".json"));
    context.AddRange(types);
    context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

我想用一个通用方法替换所有这些重复。我已经尝试过类似下面的东西,但它并不完全存在。我不确定如何引用 DbSet 属性。我可以用什么来代替注释行中的问号,或者有没有更好的替代方法来查看泛型类型的表是否为空?

//TODO: fix generic method to remove duplication of entity-specific methods
private static void Seed<T>(DbContext context)
{
    //if (context.?.Any()) return;
    var rows = JsonConvert.DeserializeObject<List<T>>(
        File.ReadAllText(SeedDirectory + Path.DirectorySeparatorChar + typeof(T).Name + ".json"));
    context.AddRange(rows);
    context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

我的 DbContext 供参考:

public class FilterListsDbContext : DbContext
{
    ...
    public DbSet<FilterList> FilterLists { get; set; }
    public DbSet<Language> Languages { get; set; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

aba*_*hev 6

private static void SeedLanguages(FilterListsDbContext context)
{
    Seed<Language>(context, c => c.Languages);
}

private static void Seed<T>(FilterListsDbContext context, Func<FilterListsDbContext, DbSet<T>> setFunc) where T : class
{
    var set = setFunc(context);
    if (set.Any()) return;
}
Run Code Online (Sandbox Code Playgroud)

或者只是使用DbContext.Set<T> 方法

private static void Seed<T>(DbContext context) where T : class
{
    var set = context.Set<T>();
    if (set.Any()) return;
}
Run Code Online (Sandbox Code Playgroud)

它存在于 EF6 中,所以我希望它存在于 EF Core 中。