DotNet Core,没有为此 DbContext 配置数据库提供程序

Posted

技术标签:

【中文标题】DotNet Core,没有为此 DbContext 配置数据库提供程序【英文标题】:DotNet Core , No database provider has been configured for this DbContext 【发布时间】:2017-09-02 01:47:26 【问题描述】:

我想使用一个简单的 LINQ 命令从我的表“标题”中选择数据,但我遇到了错误。

我的行动

    public HeaderModel GetHeaderInformation()
    
        using(var context = new ApplicationDbContext())
        
            var header = context.Headers.Select(x => new HeaderModel
            
                colorCode = x.colorCode,
                height = x.height,
                Id = x.Id,
                left = x.left,
                top = x.top,
                width = x.width
            ).FirstOrDefault();

            return header;
        
    

错误

附加信息:未配置任何数据库提供程序 这个 DbContext。可以通过覆盖来配置提供程序 DbContext.OnConfiguring 方法或通过在上使用 AddDbContext 应用服务提供商。如果使用了 AddDbContext,那么也 确保您的 DbContext 类型接受 DbContextOptions 对象 它的构造函数并将其传递给 DbContext 的基本构造函数。

我的 ApplicationDbContext

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)  

    public ApplicationDbContext() : base()  

    public DbSet<Header> Headers  get; set; 
    public DbSet<Menu> Menus  get; set; 

我的 Startup.cs

        services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
        services.AddApplicationInsightsTelemetry(Configuration);
        services.AddIdentity<ApplicationUser, IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();
        services.AddMvc();

提前致谢。

【问题讨论】:

【参考方案1】:

您正在使用依赖注入。 services.AddDbContext 负责为您创建一个 DbContext 对象。 使用 using 块是没有意义的,因为这样做会实例化一个没有连接字符串的新 ApplicationDbContext。

像这样写你的方法:

public HeaderModel GetHeaderInformation(ApplicationDbContext context)

    // the code inside your using block

.Net 将通过依赖注入解析上下文。

此外,一种常见的做法是将 DbContext 作为构造函数类中的私有只读属性。所以你可能想做这样的事情:

public class MyConroller : Controller

    private readonly MyDbContext _context;

    public MyConroller(MyDbContext ctx)
    
        _context = ctx;
    

并且只在你的方法中使用上下文属性。

【讨论】:

感谢您的回复,我只想在 using 块中新建我的 dbContext 并使用它的 DbSet 来选择、添加和删除数据。你的解决方案很好,但它没有解决我的问题。 如何将 dbcontext 注入到非控制器类的构造函数中? @zuckerthoben 你有这个问题的答案here :)【参考方案2】:

您应该删除无参数构造函数,因为它可能是在 DI 创建新实例时调用的构造函数。我知道对于某些人来说这是问题所在,我希望它有所帮助。

【讨论】:

以上是关于DotNet Core,没有为此 DbContext 配置数据库提供程序的主要内容,如果未能解决你的问题,请参考以下文章

dotnet core docker web api没有连接

DOCKER上运行DOTNET CORE

如何通过 FTP 发布 dotnet core web 后端?

DotNet core 没有与此对象关联的进程

.NET Core - 何时使用“dotnet new sln”

无法从 API(dotNet Core)获取数据(使用角度)没有“Access-Control-Allow-Origin”