【问题标题】:Adding DI to DbContext with Base implementation asp.net core 2.0使用基本实现 asp.net core 2.0 将 DI 添加到 DbContext
【发布时间】:2018-08-24 10:36:04
【问题描述】:

我的 DbContext 的基本实现如下;

public abstract class DataContext : IdentityDbContext<ApplicationUser, ApplicationRole, int>, IDataContext
{
    public DataContext(DbContextOptions<DataContext> options)
    : base(options)
    {
    }

我的实现在哪里

public class MyDataContext : DataContext, IMyDataContext
{
    public MyDataContext(DbContextOptions<DataContext> options)
    : base(options)
    {

    }

现在在运行迁移时,我使用以下(成功);

public class MyContextFactory : IDesignTimeDbContextFactory<MyDataContext>
{
    public MyContextFactory()
    {
    }

    public MyDataContext CreateDbContext(string[] args)
    {
        var builder = new DbContextOptionsBuilder<DataContext>();
        builder.UseSqlServer(DbGlobals.DevDatabase);

        return new MyDataContext(builder.Options);
    }
}

但是,当我尝试在 WebApi Startup.cs 中设置 DbContext 时,我添加如下;

        services.AddDbContext<MyDataContext>(
            options => options.UseSqlServer(DbGlobals.DevDatabase));

但是,当我运行它时,我得到以下错误;

System.InvalidOperationException:尝试激活“MyProject.Data.EF.MyDataContext”时无法解析“Microsoft.EntityFrameworkCore.DbContextOptions`1[MyProject.Data.DataContext]”类型的服务。

我认为它试图注入 DbContextOptions&lt;MyDataContext&gt; 而不是 DbContextOptions&lt;DataContext&gt;。我该如何解决它,以便它传递正确的 DbContextOptions?

或者,如果我将 MyDbContext 类构造函数调整为采用 DbContextOptions&lt;MyDataContext&gt;,那么如何将其转换为基本实现?

【问题讨论】:

  • 您正在尝试注入一些BemfeitoDataContext,而您上面显示的代码是带有数据上下文MyDataContext。这是拼写错误或复制/粘贴错误,还是真正的错误?
  • @m3n7alsnak3 是的,这是我一直在尝试的一个错字
  • 问题在于,当您尝试将 MyDataContext 添加为 dbcontext 时,它会继承 DataContext。您需要先注入DataContext,然后添加dbcontext
  • 我刚刚找到了一个基于我在这里找到的问题github.com/aspnet/EntityFrameworkCore/issues/7533 的解决方案,基本上我可以将 DbContextOptions 用于我的基本实现,然后在 MyDataContext 中使用 DbContextOptions
  • 这就是我要说的——我没有在我的实现中使用工厂。只需 MyDbContext : DbContext 作为一个类,然后 str8 将其注入服务中(在所有其他服务注入之后)。而类的构造函数就像public MyDbContext (DbContextOptions&lt;MyDbContext &gt; options) : base(options) { }

标签: c# dependency-injection asp.net-core-2.0 asp.net-core-webapi


【解决方案1】:

基于我在这里找到的线程

EntityFrameworkCore Issues

通过将DataContext基类设置为;

public abstract class DataContext : IdentityDbContext<ApplicationUser, ApplicationRole, int>, IDataContext
{
    public DataContext(DbContextOptions options)
    : base(options)
    {
    }

然后在 MyDataContext 上

public class MyDataContext : DataContext, IMyDataContext
{
    public MyDataContext(DbContextOptions<DataContext> options): base(options)
    {

    }

然后依赖注入起作用了。

【讨论】:

    【解决方案2】:

    就我而言,我使用的是这样的构造函数:

    public DataContext(DbContextOptions<DbContext> options) : base(options) { } 
    

    我只是使用了非泛型DbContextOptions,我的问题就消失了:

    public DataContext(DbContextOptions options) : base(options) { } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-08
      • 2018-08-16
      • 2018-02-04
      • 2018-10-26
      • 1970-01-01
      • 2018-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多