Как реализовать IDbContextFactory для использования с переносами данных Entity Framework

Я пытаюсь использовать миграцию данных Entity Framework, как описано в этот пост.

Однако, когда я пытаюсь выполнить шаг Enable-Migrations, я получаю следующую ошибку в консоли диспетчера пакетов:

The target context 'MyDataContext' is not constructible. Add a default constructor or provide an implementation of IDbContextFactory

Итак, я создал фабричный класс, который реализует IDbContextFactory в проекте, содержащем мой класс DbContext, но миграция данных, похоже, не распознает его.

Есть ли что-то, что я должен явно сделать, чтобы указать миграциям данных использовать этот заводской класс?


person Tim Coulter    schedule 09.07.2012    source источник


Ответы (2)


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

Процесс, через который вы прошли, кажется правильным, вот фрагмент реализации моего класса, если он вам поможет:

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

Это должно быть все, что вам нужно.

person dougajmcdonald    schedule 31.07.2012
comment
Спасибо за ответ - работает. Я не могу представить, что я сделал неправильно в первый раз, так как я помню, что сам реализовал точно такой же шаблон. В любом случае проблема решена. Спасибо. - person Tim Coulter; 03.08.2012
comment
Куда вы поместили этот класс? - person Murilo Lima; 28.05.2014
comment
Я бы предложил поместить его в сборку, содержащую ваш класс MyContext. Я бы обычно держал такой класс в отдельной сборке, такой как MyApp.Data.Model или MyApp.Domain.Model, что-то в этом духе. - person dougajmcdonald; 28.05.2014
comment
Не могли бы вы предоставить код конфигурации Ninject? Я не понимаю, куда бы я мог вставить connectionStringName, поскольку Create не принимает параметр конструктора. - person Ray Suelzer; 02.12.2014
comment
@dougajmcdonald - Любая причина, по которой мы не можем внедрить контекст в ContextFactory и вернуть его вместо создания нового экземпляра DbContext в методе создания класса ContextFactory? - person Shiva Naru; 09.04.2015
comment
Откуда EF узнает о наличии фабричного класса — MigrationsContextFactory. Разве мы не должны его где-то регистрировать, чтобы фреймворк знал? Является ли наличие этого класса независимым самодостаточным? Тим также, кажется, признал, что это не потребуется! - person Legolas21; 13.04.2016
comment
@ Legolas21 Я знаю, что это устарело, но, к вашему сведению, я обнаружил, что EF автоматически обнаружит любые классы, наследующие интерфейс IDbContextFactory<>, в соответствии с этот документ. Я считаю, что это по-прежнему верно для .NET Core. - person Alisson; 15.08.2018
comment
К вашему сведению IDbContextFactory теперь устарел. используйте IDesignTimeDbContextFactory вместо этого. - person Soren; 29.05.2019

Как указал @Soren, вместо использования IDbContextFactory, который в настоящее время устарел, в EF 2.1 мы можем реализовать IDesignTimeDbContextFactory<TContext>, который теперь поддерживает отсутствующий параметр ConnectionString.

Для подхода на основе settings.json, который вы можете использовать с любым из указанных интерфейсов, проверьте пример @Arayn что позволяет нам определить путь значения ConnectionStrings:DefaultConnection

person Julio Nobre    schedule 15.07.2021
comment
Лучше пометить ответ как дубликат, чем просто ссылаться на него. - person Gert Arnold; 15.07.2021
comment
Привет @GertArnold. Я не уверен, что вы имели в виду. Кажется, вы предполагаете, что я сделал что-то не так (что я могу), но я не могу понять это. Можете ли вы уточнить? - person Julio Nobre; 16.07.2021
comment
Вы ссылаетесь на существующий ответ SO. Обычно лучше (пометить) закрыть текущий вопрос как дубликат ответа, на который вы ссылаетесь. - person Gert Arnold; 16.07.2021
comment
На самом деле, я никогда не помечал ни одного, но с этого момента я буду следовать вашему совету. Однако в этом конкретном вопросе я не буду, так как либо вопрос нацелен на другой интерфейс EF. В любом случае, спасибо, что подсказали - person Julio Nobre; 17.07.2021