Что входит в DbContextOptions при вызове нового DbContext?

Я не использую DI и просто хочу вызвать DbContext из моего контроллера. Я пытаюсь понять, какими должны быть «варианты»?

ApplicationDbContext.cs

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{

    public DbSet<Gig> Gigs { get; set; }
    public DbSet<Genre> Genres { get; set; }


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

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        // Customize the ASP.NET Identity model and override the defaults if needed.
        // For example, you can rename the ASP.NET Identity table names and more.
        // Add your customizations after calling base.OnModelCreating(builder);
    }
}

GigsController.cs

    public class GigsController : Controller
{
    private ApplicationDbContext _context;

    public GigsController()
    {
        _context = new ApplicationDbContext();
    }


    public IActionResult Create()
    {
        var viewModel = new GigFormViewModel
        {
            Genres = _context.Genres.ToList()
        };


        return View(viewModel);
    }
}

Проблема заключается в моем конструкторе GigsController:

_context = new ApplicationDbContext();

Я ошибаюсь, потому что мне нужно передать что-то в ApplicationDbContext. Отсутствует аргумент, который соответствует обязательному формальному параметру 'options' для ApplicationDbContext.ApplicationDbContext (DbContextOptions) '

Я попытался создать конструктор по умолчанию в ApplicationDbContext, полученный из base (), но это тоже не сработало.

В моем файле startup.cs я настроил ApplicationDbContext

        public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

        services.AddMvc();

        // Add application services.
        services.AddTransient<IEmailSender, AuthMessageSender>();
        services.AddTransient<ISmsSender, AuthMessageSender>();
    }
 Stephen Zeng17 июл. 2016 г., 03:55
Какую версию Microsoft.AspNet.Identity.EntityFramework вы используете?
 Reza17 июл. 2016 г., 04:57
да, база принимает только значения DbContextOptions. Я нашел обходной путь, переопределив OnConfiguring и добавив конструктор по умолчанию, но я чувствую, что это не изящное решение, так как мне приходится выставлять строку подключения дважды ... один раз в startup.cs и один раз в классе Context
 Reza17 июл. 2016 г., 04:04
все последние версии 1.0 "Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.0.0"
 Stephen Zeng17 июл. 2016 г., 04:42
Вы пытались добавитьpublic ApplicationDbContext(): base("DefaultConnection") { } ?

Ответы на вопрос(1)

Решение Вопроса

если тыдействительно хотите создать контекст вручную, тогда вы можетеконфигурировать это так:

var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
optionsBuilder.UseSqlServer(Configuration.GetConnectionStringSecureValue("DefaultConnection"));
_context = new ApplicationDbContext(optionsBuilder.Options); 

(TheDbContextOptionsBuilder<ApplicationDbContext> класс это типoptions аргумент вservices.AddDbContext<ApplicationDbContext>(options =>). Но в контроллере у вас нет доступа кConfiguration объект, так что вы должны были бы выставить его как статическое поле вStartup.cs или используйте какой-то другой трюк, что является плохой практикой.

Лучший способ получитьApplicationDbContext это получить через DI:

public GigsController(ApplicationDbContext context)
{
    _context = context;
}

Контейнер DI позаботится о созданиии утилизировать изApplicationDbContext, Обратите внимание, что у вас все правильно настроено вStartup.cs:

services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

Это настраивает DI, так почему бы просто не использовать его?

Еще одно замечание о конструкторе по умолчаниюDbContext: В EF6 это было сделано так:public ApplicationDbContext(): base("DefaultConnection") {}, Тогда базовый объект будет использоватьSystem.Configuration.ConfigurationManager статический класс для получения строки подключения с именемDefaultConnection отweb.config, Новые ядра Asp.net и EF Core спроектированы таким образом, чтобы их можно было максимально разъединить, поэтому они не должны зависеть от какой-либо системы конфигурации. Вместо этого вы просто передаетеDbContextOptions объект - создание этого объекта и его настройка - отдельная задача.

 Ronnie Overby12 дек. 2017 г., 19:47
Разъяренная часть всего этого - это «и удаление ApplicationDbContext». Например, вы хотите использовать контекст БД, который удаляется после цикла запрос / ответ.
 Endri01 нояб. 2018 г., 09:15
Спасибо за ссылку. Я использую точный код в качестве вашего поста, но так как это трудно объяснить здесь, я создал его какновый пост
 Endri31 окт. 2018 г., 16:07
Настроить ссылку не работает. Я не хочу создавать контекст вручную, но он не работает для меня, потому что у меня естьApplicationDbContext производная формаIdentityDbContext как:public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, string>, Должен ли я опубликовать это как новый вопрос, или это достаточно просто, чтобы получить ответ здесь?
 qbik01 нояб. 2018 г., 05:40
@Endri Я исправил ссылку, но не знаю, поможет ли это ответить на ваш вопрос.IdentiityDbContext также имеет конструктор, который принимаетDbContextOptionsТаким образом, вы должны быть в состоянии использовать его так же, как описано здесь.

Ваш ответ на вопрос