7.1 Поддержка Entity Framework 6
MySQL Connector/NET интегрирует поддержку Entity Framework 6 (EF6), которая теперь включает поддержку развертывания кроссплатформенных приложений с версией EF 6.4. В этой главе описывается, как настроить и использовать функции EF6, реализованные в Connector/NET.
В этом разделе:
Минимальные требования для 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:
-
Измените разделы конфигурации в файле
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> -
Примените ссылку на сборку, используя один из следующих методов:
-
Пакет 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.
-
-
Установите новый класс
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, это:
ExecuteNonQueryAsyncExecuteScalarAsyncPrepareAsync
-
Устойчивость подключения/логика повторных попыток обеспечивает автоматическое восстановление после временных сбоев подключения. Чтобы использовать эту функцию, добавьте в метод
OnCreateModel:SetExecutionStrategy(MySqlProviderInvariantName.ProviderName, () => new MySqlExecutionStrategy());
Конфигурация на основе кода предоставляет возможность выполнения конфигурации в коде вместо выполнения в файле конфигурации, как это традиционно делается.
-
Разрешение зависимостей вводит поддержку Service Locator. Некоторые функциональные возможности, которые могут быть заменены пользовательскими реализациями, были выделены. Чтобы добавить резольвер зависимостей, используйте:
AddDependencyResolver(new MySqlDependencyResolver());
Следующие резольверы могут быть добавлены:
DbProviderFactory -> MySqlClientFactoryIDbConnectionFactory -> MySqlConnectionFactoryMigrationSqlGenerator -> MySqlMigrationSqlGeneratorDbProviderServices -> MySqlProviderServicesIProviderInvariantName -> MySqlProviderInvariantNameIDbProviderFactoryResolver -> MySqlProviderFactoryResolverIManifestTokenResolver -> MySqlManifestTokenResolverIDbModelCacheKey -> MySqlModelCacheKeyFactoryIDbExecutionStrategy -> 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 предоставляет оптимизированный способ добавления или удаления нескольких сущностей из набора.
Особенности 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.