c# - EF Core - 动态使用 DbSet 和泛型
问题描述
我的 DI 中附加了一个接口
builder.RegisterType<TaskTempo>().As<ITaskTempo>();
这样做是因为ITaskTempo
它是动态的,并且可能是多个对象之一,但共享相同的界面。
无论如何,我有手动DbContext
映射实体的地方DbSet
// DI register
builder.RegisterType<MapperFor890>().As<IEntityMapper>();
// ...
// DbContext
public partial class MyDBContext : DbContext
{
private readonly IEntityMapper _entityMapper;
// Please not that I do not want to manually add all of diff implementations of ITaskTempo here
// public virtual DbSet<TaskTempo1> TaskTempo { get; set; }
public MyDBContext(DbContextOptions<MyDBContext> options, IEntityMapper mapper)
: base(options)
{
_entityMapper = mapper;
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Map Entities
_entityMapper.Map(modelBuilder, this);
}
}
// ...
// EntityMapper
public class MapperFor890 : IEntityMapper
{
public void Map(ModelBuilder modelBuilder, DbContext context)
{
modelBuilder.Entity<TaskTempo1>(entity =>
{
// Map here the properties
});
}
}
然后,我可以从以下位置获取数据EfRepository
:
// Global Repository
public class EfRepository<TEntity> : IRepository<TEntity> where TEntity : class
{
protected readonly DbContext Context;
protected readonly ILogger<EfRepository<TEntity>> Logger;
public EfRepository(DbContext context,
ILogger<EfRepository<TEntity>> logger)
{
Context = context;
Logger = logger;
}
public virtual IQueryable<TEntity> Find(Expression<Func<TEntity, bool>> predicate)
{
Logger.LogDebug($"Finding '{typeof(TEntity).Name}' with predicate");
return Context.Set<TEntity>().Where(predicate);
}
}
// TaskTempo Repository
public class TaskTempoRepository<TTaskTempo> : EfRepository<TTaskTempo>, ITaskScanRepository<TTaskTempo> where TTaskTempo : class, ITaskTempo
{
public MyDBContext DbContext => Context as MyDBContext;
public TaskScanRepository(MyDBContext context, ILogger<TaskScanRepository<TTaskTempo>> logger) : base(context,logger)
{
}
}
// DI injection
builder.RegisterType<TaskTempo1>().As<ITaskTempo>();
builder.RegisterType<TaskTempoRepository<ITaskTempo>>().As<ITasTempoRepository<ITaskTempo>>();
一旦我取
_taskTempoRepository.Find(t => t.Id = 3);
我收到以下错误:
无法为“ITaskTempo”创建 DbSet,因为此类型未包含在上下文模型中
解决方案
推荐阅读
- c++ - 如何在不使用赋值运算符的情况下为动态变量分配初始值?
- typescript - 在打字稿类中重写包含闭包的javascript
- javascript - 试图通过点击找到这个然后切换类?
- corda - VaultTrackBy 给出了交易中涉及的所有状态
- python - 气流从与执行文件相同的指定路径中的文件导入时出现问题
- excel - Excel VBA,检查网络外的最新版本?
- php - outlook(smtp) 返回“504 5.7.4 无法识别的身份验证类型”
- swift - 如何为 swift 设置标题搜索路径?
- android - 如何使用 Roboelectric 测试 IntentService - 出现错误
- google-chrome-extension - chrome重新打开带有扩展名的关闭选项卡时没有历史记录