"Контекст" неконструктивен. Добавьте конструктор по умолчанию или выполните реализацию 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
передает только строку соединения при запуске проекта, а не когда я использую первые миграции кода. Во всяком случае, я могу ввести/предоставить значение по умолчанию для имени соединения при первом переходе кода?
Ответы
Ответ 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
, необходимо указать это вручную.