尝试激活存储库时出现Dbcontext继承错误

时间:2018-02-20 13:55:24

标签: c# asp.net-mvc asp.net-core entity-framework-core

我的应用程序有两个数据库: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继承。

有人能帮助我吗?感谢。

1 个答案:

答案 0 :(得分:1)

注入器正在寻找创建类型为BeehouseIdentityContext的实例。

构造函数需要类型为DbContextOptions的对象。注入器无法实例化此类型以激活BeehouseIdentityContext,因此会引发错误。

告诉注入器如何创建类型DbContextOptions的实例或创建使用默认值的构造函数,并且不需要此类型。