Ошибка передачи существующих подключений в конструктор DbContext при использовании базы данных

c# entity-framework entity-framework-6

Вопрос

Я пытаюсь создать класс для выполнения работы над базой данных и иметь (или предпочитаю) использовать комбинацию DbContext и старого старого ADO. Почему EF отлично подходит для упрощения большого количества кода, но ADO все еще имеет много применений для более сложных методов, которые EF еще не может обработать.

Эта ссылка на MSDN гласит, что я могу передать существующий SqlConnection в свой контекст следующим образом:

using (var conn = new SqlConnection("..."))
{ 
    conn.Open();
    using (var context = new SampleContext(conn, contextOwnsConnection: false))
    {
    // Do Something
    }
}

Теперь я использую Database-First, поэтому этот конструктор не отображается как стандартный. Поэтому я создал новый файл Partial Class и создал соответствующий конструктор следующим образом:

public partial class MyEntities : DbContext
{
    public MyEntities(System.Data.Common.DbConnection conn, bool contextOwnsConnection = false)
        : base(existingConnection: conn, contextOwnsConnection: contextOwnsConnection)
    {

    }
}

Однако, когда я запускаю код в тот момент, когда он обращается к вызову нового конструктора DbContext, я получаю следующую ошибку UnintentionalCodeFirstException () , вызванную OnModelCreating в моем файле EDMX:

«Код, сгенерированный с использованием шаблонов T4 для разработки базы данных First и Model First, может работать некорректно, если используется в режиме Code First. Чтобы продолжить использование базы данных First или Model First, убедитесь, что строка подключения Entity Framework указана в файле конфигурации исполняемого приложения. Чтобы использовать эти классы, которые были сгенерированы из базы данных First или Model First, с кодом First добавьте любую дополнительную конфигурацию с использованием атрибутов или DbModelBuilder API, а затем удалите код, который выдает это исключение ».

Я пропустил что-то очевидное здесь, или это просто невозможно сделать с помощью Database-First?

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

Любая помощь очень ценится. Для полного раскрытия я использую SQL-Server 2012, .NET 4.5.1, C # и EF6.0.2.

Принятый ответ

Строки подключения, используемые дизайнером, не являются регулярными строками соединения. Скорее, это строки EntityConnection . Разница заключается в том, что строки подключения сущности содержат дополнительную информацию о том, где найти метаданные, описывающие модель, которая находится в форме edmx во время разработки, - читайте здесь . Code First использует только обычные строки соединения, поскольку он строит модель «на лету» на основе кода. Таким образом, UnintentionalCodeFirstException не позволяет пользователю использовать функциональность CodeFirst с edmx-моделями, потому что модель указана в edmx, а не в коде, и если бы это было разрешено, вы бы фактически закончили использование двух разных моделей (один из edmx и один из построенных из код), который, скорее всего, не будет синхронизирован, что приведет к странному поведению или даже может привести к повреждению данных и сбоям / исключениям. Поскольку EntityConnection получен из DbConnection и просто обматывает регулярное соединение, вы можете использовать его в тех местах, где вы использовали бы соединение с провайдером. В качестве альтернативы вы можете получить доступ к обернутому соединению поставщика, используя поставщик StoreConnection в EntityConnection .



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему