Подтвердить что ты не робот

"Контекст" неконструктивен. Добавьте конструктор по умолчанию или выполните реализацию IDbContextFactory. "

Я получаю эту ошибку, когда пытаюсь использовать первые миграции кода.

В моем контексте есть конструктор с именем соединения.

public class VeraContext : DbContext, IDbContext
{
    public VeraContext(string NameOrConnectionStringName = "VeraDB")
        : base(NameOrConnectionStringName)
    {
    }

    public IDbSet<User> Users { get; set; }
    public IDbSet<Product> Products { get; set; }
    public IDbSet<IntCat> IntCats { get; set; }
}

Это имя соединения вводится с помощью ninject при запуске проекта, я также указал его как значение по умолчанию, как в приведенном выше коде, но это не помогло.

kernel.Bind<IDbContext>()
    .To<VeraContext>()
    .WithConstructorArgument("NameOrConnectionStringName", "VeraDB");

Когда я пытаюсь добавить миграции с помощью "Enable-Migrations", это вызывает ошибку:

Целевой контекст "VeraData.EF.Infrastructure.VeraContext" не является конструктивны. Добавить конструктор по умолчанию или предоставить реализацию IDbContextFactory.

Если я удалю конструктор из VeraContext, он будет работать, но в качестве его имени будет создана другая база данных с VeraData.EF.Infrastructure.VeraContext.

Я предполагаю, что ninject передает только строку соединения при запуске проекта, а не когда я использую первые миграции кода. Во всяком случае, я могу ввести/предоставить значение по умолчанию для имени соединения при первом переходе кода?

4b9b3361

Ответ 1

По существу вам нужен по умолчанию ctor (что ошибка), но просто его реализация приведет к проблемам.

Вам нужно будет реализовать IDbContextFactory, чтобы результаты были согласованными (или ваша миграция из кода не будет работать и т.д.).

Миграции действительно называют ваш конструктор по умолчанию, чтобы сделать подключение. Так что вы другой ctor не имеет большого значения.

Вот основные factory...

public class MyContextFactory : IDbContextFactory<MyContext>
{
    public MyContext Create()
    {
        return new MyDBContext("YourConnectionName");
    }
}

Вы должны объединить это с инъекцией, ввести и сконструировать свой DbContext по своему усмотрению.

Ответ 2

Если вы не хотите тратить время на просмотр параметра IDbContextFactory и получать работу, создайте конструктор по умолчанию и скопируйте имя строки подключения при вызове базового DbContext:

public class CustomContext : DbContext
{
    public CustomContext() :base("name=Entities") {} 
}

SRC: http://www.appetere.com/Blogs/SteveM/April-2012/Entity-Framework-Code-First-Migrations

Ответ 3

Чтобы дополнить @nccsbim071 ответ, мне нужно добавить еще одну вещь... эта опция не любит конструктор с параметрами по умолчанию... например:

public MyContext(bool paramABC = false) : base("name=Entities") {...}

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

public MyContext() :base("name=Entities") {...} 
public MyContext(bool paramABC) : this() {...}

ПРИМЕЧАНИЕ:

  • Entities в этом случае означает имя строки подключения... По соглашению имя контекста совпадает с именем строки подключения, а поскольку MyContext не совпадает с Entities, необходимо указать это вручную.