将设置注入到类库中的EF核心上下文中

时间:2019-01-28 13:15:11

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

我的API项目中的我的连接字符串位于appsettings.json中,我想在我的数据库项目的上下文中使用它。通常,依赖注入可以解决问题,但是,当我运行迁移时,会出现以下错误:

  

无法创建“上下文”类型的对象。对于不同   设计时支持的模式,请参阅   https://go.microsoft.com/fwlink/?linkid=851728

在上下文中对连接字符串进行硬编码可解决此问题,但对我来说这不是一个可行的解决方案,因为我需要根据环境更改连接字符串。请从API项目中查看我的ConfigureServices方法,从数据库项目中查看上下文。

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed
        // for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));

    services.AddDbContext<Context>();

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

public class Context : DbContext
{
    private readonly IOptions<AppSettings> _settings;

    public Context(IOptions<AppSettings> settings) : base()
    {
        _settings = settings;
    }

    public Context(IOptions<AppSettings> settings, DbContextOptions<Context> options) : base(options)
    {
        _settings = settings;
    }

    ***DBSets***

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(_settings.Value.DBConnectionString);
    }
}

2 个答案:

答案 0 :(得分:2)

.NET Core中最简单的方法如下:

services.AddDbContext<Context>(options => {
    options.UseSqlServer(Configuration.GetConnectionString("<key in appsettings>"));
});

您的Context类确实应该继承DbContext。 这还将允许您的Context依赖注入。

您的应用设置应为:

"ConnectionStrings"  : {
    "<key in appsettings>" : "<connection string>"
},

其中ConnectionStrings在设置json的根目录下。

答案 1 :(得分:0)

我找到了解决方案,请参阅下文。

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using System;

namespace Database
{
    public class Context : DbContext
    {
        public Context() : base()
        {
            IConfigurationRoot configuration = new ConfigurationBuilder()
                         .SetBasePath(AppDomain.CurrentDomain.BaseDirectory + @"..\..\..\..\")
                         .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                         .AddEnvironmentVariables()
                         .Build();

            ConnectionString = configuration.GetConnectionString("Database");
        }

        public string ConnectionString { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(ConnectionString);
        }
    }
}
相关问题