Question: No database provider has been configured for this DbContext for get method in Asp.netCore

Question

No database provider has been configured for this DbContext for get method in Asp.netCore

Answers 1
Added at 2017-01-01 12:01
Tags
Question

I create an web api project by Asp.net core, and i added an api controller to it(by the name BlogController), in blog controller i have a get method GetAllBlog this is my controller:

[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();
    }
 }

this is my IContext and model:

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

and context:

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; }
}

and model:

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; }
}

when i call GetAllBlog() i got this error:

No database provider has been configured for this DbContext. A provider can be configured by overriding the DbContext.OnConfiguring method or by using AddDbContext on the application service provider. If AddDbContext is used, then also ensure that your DbContext type accepts a DbContextOptions object in its constructor and passes it to the base constructor for DbContext. what is the problem?

UPDATE: this is the configurationservice method in Startup class:

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();
}
Answers
nr: #1 dodano: 2017-01-01 13:01

When configuring the DbContext

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

you configure it to use specific options options.UseSqlServer(connection)

but when configuring the scoped context abstraction

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

a new Context is being created with a completely different configuration to what was configured before.

by changing how the IContext is registered with the DI framework during startup like this

services.AddScoped<IContext, Context>();

The DI framework will use the AddDbContext configuration when creating instances of Context instead, which will have the options you want to use from startup configuration when creating instances of the DbContext.

the Startup.ConfigurServices would end up looking like this...

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();
}
Source Show
◀ Wstecz