检查 DbSet<T> 是否为空。

3

我正在研究一种从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个回答

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

或者只需要使用DbContext.Set<T> 方法:

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

EF6中有这个功能,希望在EF Core中也有。


太好了!那个有效了!你帮我省去了很多重复的工作。 :) https://github.com/collinbarrett/FilterLists/commit/2355cba86bcbd0340cdcf519d9b42ae3f373ab90 - Collin Barrett
我需要修改的唯一一件事,是使用您的第二种方法,并添加 where T : class 以避免引用类型错误。 - Collin Barrett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接