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)
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 中。
| 归档时间: |
|
| 查看次数: |
2387 次 |
| 最近记录: |