Внедрение настроек в основной контекст EF в библиотеке классов - PullRequest
0 голосов
/ 28 января 2019

У меня есть строка подключения в appsettings.json в моем проекте API, которую я хочу использовать в моем контексте в моем проекте базы данных.Обычно внедрение зависимостей делает свое дело, однако, когда я запускаю миграции, я получаю эту ошибку:

Невозможно создать объект типа «Контекст».Для различных шаблонов, поддерживаемых во время разработки, см. https://go.microsoft.com/fwlink/?linkid=851728!

Жесткое кодирование строки подключения в контексте решает эту проблему, но не является жизнеспособным решением для меня, так как мне нужно изменить строку подключенияв зависимости от окружающей среды.Пожалуйста, посмотрите мой метод ConfigureServices из проекта API и контекст из проекта базы данных.

// 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 голосов
/ 31 января 2019

Я нашел решение, см. Ниже.

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);
        }
    }
}
0 голосов
/ 28 января 2019

Самый простой способ сделать это в .NET Core заключается в следующем:

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

Ваш класс Context действительно должен наследовать DbContext.Это также позволит внедрить зависимости вашего Context.

. Ваши настройки приложений должны выглядеть следующим образом:

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

, где ConnectionStrings находится на корневом уровне в настройках json.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...