我正在研究一种从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; }
...
}
答案 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中存在。