在Asp.netCore中沒有為此DbContext配置get方法的數據庫提供程序

asp.net-core asp.net-web-api c# entity-framework-core

我通過Asp.net核心創建了一個web api項目,我添加了一個api控制器(名稱為BlogController ),在博客控制器中我有一個get方法GetAllBlog這是我的控制器:

[Route("api/[controller]")]
public class BlogController : Controller
{
    private static Logger logger = LogManager.GetCurrentClassLogger();

    public IContext _context { get; set; }
    public BlogController(IContext ctx)
    {
        _context = ctx;
    }

    [HttpGet]
    public IEnumerable<Blog> GetAllBlog()
    {
        return _context.Blogs.ToList();
    }
 }

這是我的IContext和模型:

public interface IContext : IDisposable
{
    DbSet<Blog> Blogs { get; set; }
    DbSet<Post> Posts { get; set; }
    int SaveChanges();
}

和背景:

public class Context : DbContext, IContext
{
    public Context(DbContextOptions<Context> options) : base(options)
    { }
    public virtual DbSet<Blog> Blogs { get; set; }
    public virtual DbSet<Post> Posts { get; set; }
}

和型號:

public class Blog
{
    public int BlogId { get; set; }
    public string Name { get; set; }
    public string Url { get; set; }
    public DateTime? CreationDate { get; set; }
    public virtual IList<Post> Posts { get; set; }
}

當我調用GetAllBlog()出現此錯誤:

沒有為此DbContext配置數據庫提供程序。可以通過覆蓋DbContext.OnConfiguring方法或在應用程序服務提供程序上使用AddDbContext來配置提供程序。如果使用AddDbContext,那麼還要確保您的DbContext類型在其構造函數中接受DbContextOptions對象,並將其傳遞給DbContext的基礎構造函數。問題是什麼?

更新:這是Startup類中的configurationservice方法:

public void ConfigureServices(IServiceCollection services)
{
    var connection = @"Data Source=.;Initial Catalog=RestfullServices;Integrated Security=true";
    services.AddDbContext<Context>(options => options.UseSqlServer(connection));
    services.AddScoped<IContext>(p => new Context(new DbContextOptions<Context>()));
    services.AddApplicationInsightsTelemetry(Configuration);
    services.AddMvc();
}

一般承認的答案

配置DbContext時

services.AddDbContext<Context>(options => options.UseSqlServer(connection));

您將其配置為使用特定選項options.UseSqlServer(connection)

但是在配置範圍的上下文抽象時

services.AddScoped<IContext>(p => new Context(new DbContextOptions<Context>()));

正在創建一個新的Context ,其配置與之前配置的完全不同。

通過在啟動期間更改IContext在DI框架中的註冊方式,就像這樣

services.AddScoped<IContext, Context>();

在創建Context實例時,DI框架將使用AddDbContext配置,在創建AddDbContext實例時,它將具有您希望在啟動配置中使用的選項。

Startup.ConfigurServices最終看起來像這樣......

public void ConfigureServices(IServiceCollection services) {
    var connection = @"Data Source=.;Initial Catalog=RestfullServices;Integrated Security=true";
    services.AddDbContext<Context>(options => options.UseSqlServer(connection));
    services.AddScoped<IContext, Context>();
    services.AddApplicationInsightsTelemetry(Configuration);
    services.AddMvc();
}


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因