我的应用程序有两个数据库:MainDbContext,它继承自DbContext,IdentifiedDbContext继承自MainDbContext。
MainDbContext使用基类,如EntityBase和Id,createdAt,updatedAt。 IdentifiedDbContext使用从EntityBase继承的IdentifiedEntityBase类,其属性为CreatorId,OwnerId。
我的应用程序还有一个Repository和IdentifiedRepository,它继承自Repository。
代码如下所示:
public class BeehouseContext:DbContext
{
public BeehouseContext(DbContextOptions<BeehouseContext> options) : base(options)
{
// -- Construtor
}
protected BeehouseContext(DbContextOptions options):base(options)
{
// -- Construtor fix
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
#region EntityBase
modelBuilder.Ignore<Beehouse.Framework.Domain.EntityBase>();
#endregion
}
}
{
public BeehouseIdentityContext(DbContextOptions<BeehouseIdentityContext> options) : base(options)
{
// -- Construtor
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
#region EntityBase
modelBuilder.Ignore<Beehouse.Framework.Identity.Domain.IdentifiedEntity>();
#endregion
}
}
public class Repository<TEntity> : IRepository<TEntity> where TEntity : EntityBase
{
protected readonly BeehouseContext Context;
public Repository(BeehouseContext context)
{
Context = context;
}
private DbSet<TEntity> _entities;
protected virtual DbSet<TEntity> Entities
{
get
{
if (_entities is null)
{
_entities = Context.Set<TEntity>();
}
return _entities;
}
}
// Other methods
}
public class IdentifiedRepository<TEntity>:Repository<TEntity>, IIdentifiedRepository<TEntity> where TEntity:IdentifiedEntity
{
protected readonly string UserId; // as Dealer
protected readonly string CreatorId; // as Retailer
protected readonly string CreatorAlias;
public IdentifiedRepository(IHttpContextAccessor httpContextAccessor, BeehouseIdentityContext context):base(context)
{
if (httpContextAccessor.HttpContext.User.FindFirst("sub") == null) return;
CreatorId = httpContextAccessor.HttpContext.User.FindFirst("sub").Value;
CreatorAlias = httpContextAccessor.HttpContext.User.FindFirst(SubscriptionClaimTypes.ProfileName).Value;
UserId = httpContextAccessor.HttpContext.User.FindFirst(SubscriptionClaimTypes.DealerUserId).Value;
}
在依赖注入中,我可以创建IdentifiedRepository
的实例,但在某些情况下我只需要实例化存储库,但我不能。抛出以下错误:
InvalidOperationException:无法解析类型的服务 'Microsoft.EntityFrameworkCore.DbContextOptions`1 [Beehouse.Framework.Identity.Data.BeehouseIdentityContext]' 在尝试激活时 'Beehouse.Framework.Identity.Data.BeehouseIdentityContext'。
我试过编辑像:
这样的构造函数BeehouseContext(DbContextOptions options) : base(options)
BeehouseIdentityContext(DbContextOptions options) : base(options)
但这也不起作用。
我的依赖注入看起来像这样但不起作用:
// Database
services.AddDbContext<IdentityServerContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("connstring")));
services.AddTransient(typeof(BeehouseContext), typeof(BeehouseIdentityContext));
我还试图像这样添加DbContext
:
services.AddDbContext<IdentityServerContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("auxiliarc-local")));
services.AddDbContext<BeehouseContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("auxiliarc-local")));
但是由于以下错误也失败了:
InvalidOperationException:无法为“Plan”创建DbSet,因为 此类型不包含在上下文的模型中。
计划在命名空间和项目标识中,但仅从EntityBase继承。
有人能帮助我吗?感谢。
答案 0 :(得分:1)
注入器正在寻找创建类型为BeehouseIdentityContext
的实例。
构造函数需要类型为DbContextOptions
的对象。注入器无法实例化此类型以激活BeehouseIdentityContext
,因此会引发错误。
告诉注入器如何创建类型DbContextOptions
的实例或创建使用默认值的构造函数,并且不需要此类型。