如何正确配置“ ConfigureServices”方法的“ services.AddDbContext”

时间:2019-06-10 19:39:48

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

我正在尝试使用EF Core运行.NET Core Web应用程序。为了测试存储库,我添加了一个MyDbContext,它继承了EF DbContext和接口IMyDbContext

public interface ICalendarDbContext
{
    DbSet<MyModel> Models { get; set; }
}

public class MyDbContext : DbContext, IMyDbContext
{
    public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
    {
    }

    public virtual DbSet<MyModel> Models { get; set; }
}

上下文接口被注入到我的通用存储库中:

public class GenericRepository<TEntity> : IGenericRepository<TEntity>
{
    private readonly IMyDbContext _context = null;

    public GenericRepository(IMyDbContext context)
    {
        this._context = context;
    }
}

当我在startup.cs上使用此代码(不带界面)时:

services.AddDbContext<MyDbContext>(options =>
     options.UseSqlServer(...));

我遇到了运行时错误:

  

InvalidOperationException:无法解析类型的服务   尝试激活“ GenericRepository`1 [MyModel]”时出现“ IMyDbContext”

使用此行代码时:

services.AddDbContext<IMyDbContext>(options =>
     options.UseSqlServer(...));

我得到了以下编译时错误代码:

  

无法将lambda表达式转换为类型'ServiceLifetime',因为它   不是委托类型

我的问题是如何正确配置services.AddDbContext方法中的ConfigureServicesConfigure方法内部是否需要任何更改?) 如果需要,我愿意修改IMyDbContext

2 个答案:

答案 0 :(得分:2)

使用具有两个泛型类型参数的overloads之一,它使您既可以指定要注册的服务接口/类,也可以指定实现它的.promo { position: relative; } .promo img { z-index: 1; } .hilight { background-color: rgba(0,0,0,0.65); position: absolute; height: 85px; width: 415px; font-family: Verdana, Geneva, sans-serif; color: #FFF; z-index: 1; } 派生类。

例如:

DbContext

答案 1 :(得分:0)

刚刚找到答案:

我没有在IMyDbContextMyDbContext之间添加范围。

public void ConfigureServices(IServiceCollection services)
{                    
    services.AddDbContext<MyDbContext>(options => options.UseSqlServer(...));
    services.AddScoped<IGenericRepository<MyModel>, GenericRepository<MyModel>>();
    services.AddScoped<IMyDbContext, MyDbContext>();
}