Spec-Zone.ru › MySQL Connectors 1.0

7.1 Поддержка Entity Framework 6

MySQL Connector/NET интегрирует поддержку Entity Framework 6 (EF6), которая теперь включает поддержку развертывания кроссплатформенных приложений с версией EF 6.4. В этой главе описывается, как настроить и использовать функции EF6, реализованные в Connector/NET.

В этом разделе:

  • Минимальные требования для EF6 только для Windows

  • Минимальные требования для EF 6.4 с кроссплатформенной поддержкой

  • Настройка

  • Функции EF6

  • Функции Code First

  • Пример использования EF6

Минимальные требования для EF6 только для Windows

  • Connector/NET 6.10 или 8.0.11

  • MySQL Server 5.6

  • Сборки Entity Framework 6

  • .NET Framework 4.6.2

Минимальные требования для EF 6.4 с кроссплатформенной поддержкой

  • Connector/NET 8.0.22

  • MySQL Server 5.6

  • Сборки Entity Framework 6.4

  • .NET Standard 2.1 (.NET Core SDK 3.1 и Visual Studio 2019 версии 16.5)

Настройка

Примечание

Серия выпусков MySQL Connector/NET 8.0 имеет схему именования для сборок EF6 и пакетов NuGet, которая отличается от схемы, используемой в предыдущих сериях выпусков, таких как 6.9 и 6.10. Чтобы настроить Connector/NET 6.9 или 6.10 для использования с EF6, замените имена сборок и пакетов в этом разделе на следующие:

  • Сборка: MySql.Data.Entity.EF6

  • Пакет NuGet: MySql.Data.Entity

    Дополнительную информацию о пакете NuGet MySql.Data.Entity и его использовании см. на https://www.nuget.org/packages/MySql.Data.Entity/.

Для настройки поддержки Connector/NET для EF6:

  1. Измените разделы конфигурации в файле app.config, чтобы добавить строку подключения и поставщик Connector/NET.

    <connectionStrings>
        <add name="MyContext" providerName="MySql.Data.MySqlClient"
            connectionString="server=localhost;port=3306;database=mycontext;uid=root;password=********"/>
    </connectionStrings>
    <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"/>
        <providers>
            <provider invariantName="MySql.Data.MySqlClient"
                type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.EntityFramework"/>
            <provider invariantName="System.Data.SqlClient"
                type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
        </providers>
    </entityFramework>
    
  2. Примените ссылку на сборку, используя один из следующих методов:

    • Пакет NuGet. Установите пакет NuGet, чтобы автоматически добавить эту ссылку в файл app.config или web.config во время установки. Например, для установки пакета для Connector/NET 8.0.22 используйте один из следующих вариантов установки:

      • Командная строка (CLI)

        dotnet add package MySql.Data.EntityFramework -Version 8.0.22
        
      • Консоль диспетчера пакетов (PMC)

        Install-Package MySql.Data.EntityFramework -Version 8.0.22
        
      • Visual Studio с менеджером пакетов NuGet. Для этого варианта выберите nuget.org в качестве источника пакета, найдите mysql.data и установите стабильную версию пакета MySql.Data.EntityFramework.

    • Файл MSI MySQL Connector/NET. Установите MySQL Connector/NET, а затем добавьте ссылку на сборку MySql.Data.EntityFramework в свой проект. В зависимости от используемой версии .NET Framework, сборка берется из папки v4.0, v4.5 или v4.8.

    • Исходный код MySQL Connector/NET. Соберите Connector/NET из исходного кода, а затем вставьте следующую информацию о поставщике данных в файл app.config или web.config:

      <system.data>
         <DbProviderFactories>
           <remove invariant="MySql.Data.MySqlClient" />
           <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL"
                type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=8.0.22.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
         </DbProviderFactories>
      </system.data>
      
      Важно

      Всегда обновляйте номер версии, чтобы он соответствовал номеру в сборке MySql.Data.dll.

  3. Установите новый класс DbConfiguration для MySQL. Этот шаг необязателен, но крайне рекомендуется, так как он добавляет все резольверы зависимостей для классов MySQL. Это можно сделать тремя способами:

    • Добавление DbConfigurationTypeAttribute в класс контекста:

      [DbConfigurationType(typeof(MySqlEFConfiguration))]
      
    • Вызов DbConfiguration.SetConfiguration(new MySqlEFConfiguration()) при запуске приложения.

    • Установите тип DbConfiguration в файле конфигурации:

      <entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.EntityFramework">
      

    Также можно создать пользовательский класс DbConfiguration и добавить необходимые резольверы зависимостей.

Функции EF6

Ниже приведены новые функции Entity Framework 6, реализованные в Connector/NET:

  • Кроссплатформенная поддержка в Connector/NET 8.0.22 реализует EF 6.4 как начальную версию поставщика, чтобы включить совместимость с Linux и macOS с .NET Standard 2.1 от Microsoft.

  • Асинхронные запросы и сохранение добавляет поддержку основанных на задачах асинхронных шаблонов, доступных с .NET 4.5. Новые асинхронные методы, поддерживаемые Connector/NET, это:

    • ExecuteNonQueryAsync

    • ExecuteScalarAsync

    • PrepareAsync

  • Устойчивость подключения/логика повторных попыток обеспечивает автоматическое восстановление после временных сбоев подключения. Чтобы использовать эту функцию, добавьте в метод OnCreateModel:

    SetExecutionStrategy(MySqlProviderInvariantName.ProviderName, () => new MySqlExecutionStrategy());
    
  • Конфигурация на основе кода предоставляет возможность выполнения конфигурации в коде вместо выполнения в файле конфигурации, как это традиционно делается.

  • Разрешение зависимостей вводит поддержку Service Locator. Некоторые функциональные возможности, которые могут быть заменены пользовательскими реализациями, были выделены. Чтобы добавить резольвер зависимостей, используйте:

    AddDependencyResolver(new MySqlDependencyResolver());
    

    Следующие резольверы могут быть добавлены:

    • DbProviderFactory -> MySqlClientFactory

    • IDbConnectionFactory -> MySqlConnectionFactory

    • MigrationSqlGenerator -> MySqlMigrationSqlGenerator

    • DbProviderServices -> MySqlProviderServices

    • IProviderInvariantName -> MySqlProviderInvariantName

    • IDbProviderFactoryResolver -> MySqlProviderFactoryResolver

    • IManifestTokenResolver -> MySqlManifestTokenResolver

    • IDbModelCacheKey -> MySqlModelCacheKeyFactory

    • IDbExecutionStrategy -> MySqlExecutionStrategy

  • Перехват/журналирование SQL предоставляет низкоуровневые строительные блоки для перехвата операций Entity Framework с простой системой журналирования SQL, построенной сверху:

    myContext.Database.Log = delegate(string message) { Console.Write(message); };
    
  • DbContext теперь можно создать с уже открытым DbConnection, что позволяет использовать сценарии, в которых было бы полезно, если бы подключение можно было открыть при создании контекста (например, при совместном использовании подключения между компонентами, когда вы не можете гарантировать состояние подключения).

      [DbConfigurationType(typeof(MySqlEFConfiguration))]
      class JourneyContext : DbContext
      {
        public DbSet<MyPlace> MyPlaces { get; set; }
    
        public JourneyContext()
          : base()
        {
    
        }
    
        public JourneyContext(DbConnection existingConnection, bool contextOwnsConnection)
          : base(existingConnection, contextOwnsConnection)
        {
    
        }
      }
    
      using (MySqlConnection conn = new MySqlConnection("<connectionString>"))
      {
        conn.Open();
        ...
    
        using (var context = new JourneyContext(conn, false))
        {
          ...
        }
      }
    
  • Улучшенная поддержка транзакций обеспечивает поддержку транзакции, внешней по отношению к фреймворку, а также улучшенные способы создания транзакции в Entity Framework. Начиная с Entity Framework 6, Database.ExecuteSqlCommand() по умолчанию будет заключать команду в транзакцию, если таковой не было. Существуют перегрузки этого метода, которые позволяют пользователям переопределять это поведение по желанию. Выполнение хранимых процедур, включенных в модель через API, такие как ObjectContext.ExecuteFunction(), делает то же самое. Также можно передать существующую транзакцию в контекст.

  • DbSet.AddRange/RemoveRange предоставляет оптимизированный способ добавления или удаления нескольких сущностей из набора.

END_OF_DOCUMENT_MARKER ```

Особенности Code First

Ниже приведены новые возможности Code First, поддерживаемые Connector/NET:

  • Сопоставление Code First с хранимыми процедурами Insert/Update/Delete поддерживается:

    modelBuilder.Entity<EntityType>().MapToStoredProcedures();
    
  • Идемпотентные скрипты миграций позволяют генерировать SQL-скрипт, который может обновлять базу данных до любой версии, включая последнюю. Для этого выполните команду Update-Database -Script -SourceMigration: $InitialDatabase в консоли Package Manager.

  • Настраиваемая таблица истории миграций позволяет настроить определение таблицы истории миграций.

Пример использования EF6

Следующий пример кода C# представляет структуру модели Entity Framework 6.

using MySql.Data.Entity;
using System.Data.Common;
using System.Data.Entity;

namespace EF6
{
  // Code-Based Configuration and Dependency resolution
  [DbConfigurationType(typeof(MySqlEFConfiguration))]
  public class Parking : DbContext
  {
    public DbSet<Car> Cars { get; set; }

    public Parking()
      : base()
    {

    }

    // Constructor to use on a DbConnection that is already opened
    public Parking(DbConnection existingConnection, bool contextOwnsConnection)
      : base(existingConnection, contextOwnsConnection)
    {

    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
      base.OnModelCreating(modelBuilder);
      modelBuilder.Entity<Car>().MapToStoredProcedures();
    }
  }

  public class Car
  {
    public int CarId { get; set; }

    public string Model { get; set; }

    public int Year { get; set; }

    public string Manufacturer { get; set; }
  }
}

Следующий пример кода C# демонстрирует, как использовать сущности из предыдущей модели в приложении, хранящем данные в таблице MySQL.

using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;

namespace EF6
{
  class Example
  {
    public static void ExecuteExample()
    {
      string connectionString = "server=localhost;port=3305;database=parking;uid=root";

      using (MySqlConnection connection = new MySqlConnection(connectionString))
      {
        // Create database if not exists
        using (Parking contextDB = new Parking(connection, false))
        {
          contextDB.Database.CreateIfNotExists();
        }

        connection.Open();
        MySqlTransaction transaction = connection.BeginTransaction();

        try
        {
          // DbConnection that is already opened
          using (Parking context = new Parking(connection, false))
          {

            // Interception/SQL logging
            context.Database.Log = (string message) => { Console.WriteLine(message); };

            // Passing an existing transaction to the context
            context.Database.UseTransaction(transaction);

            // DbSet.AddRange
            List<Car> cars = new List<Car>();

            cars.Add(new Car { Manufacturer = "Nissan", Model = "370Z", Year = 2012 });
            cars.Add(new Car { Manufacturer = "Ford", Model = "Mustang", Year = 2013 });
            cars.Add(new Car { Manufacturer = "Chevrolet", Model = "Camaro", Year = 2012 });
            cars.Add(new Car { Manufacturer = "Dodge", Model = "Charger", Year = 2013 });

            context.Cars.AddRange(cars);

            context.SaveChanges();
          }

          transaction.Commit();
        }
        catch
        {
          transaction.Rollback();
          throw;
        }
      }
    }
  }
}

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/connector-net-en/connector-net-entityframework60.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API