我正在研究一种从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();
}
我希望用一个通用方法来替代所有这些重复的内容。我尝试了下面的代码,但是还不够完善。我不确定如何引用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; }
...
}
where T : class
以避免引用类型错误。 - Collin Barrett