检查DbSet <t>是否为空

时间:2018-01-18 20:50:53

标签: c# .net entity-framework generics entity-framework-core

我正在研究一种从json播种EF Core数据库的方法。因此,我有一系列方法,如下所示,每个实体都有所需的功能(FilterListLanguage是两个示例实体)。除名称,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();
}

我想用一个通用方法替换所有这些重复。我尝试了类似下面的东西,但它并不完全存在。我不知道如何引用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();
}

我的DbContext供参考:

public class FilterListsDbContext : DbContext
{
    ...
    public DbSet<FilterList> FilterLists { get; set; }
    public DbSet<Language> Languages { get; set; }
    ...
}

1 个答案:

答案 0 :(得分:4)

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;
}

或只使用DbContext.Set<T> method

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

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