Entity Framework это имя, данное ряду технологий, которые поддерживают разработку ориентированных на данные приложений. MySQL Connector/NET поддерживает Entity Framework 6.0 (EF6 или EF 6.4) и Entity Framework Core (EF Core), который является новой структурой, доступной разработчикам .NET, которые работают с данными MySQL, используя объекты .NET.
Следующая таблица показывает набор версий Connector/NET и возможности Entity Framework.
Таблица 7.1. Версии Connector/NET и поддержка Entity Framework
| Версия Connector/NET | EF6 | EF 6.4 | EF Core |
|---|---|---|
| 8.0 |
|
|
| 6.10 |
|
|
MySQL Connector/NET объединяет поддержку Entity Framework 6 (EF6), которая теперь включает поддержку развертывания кросс-платформенного приложения с версией EF 6.4. В этой главе описывается, как формировать и использовать функции EF6, которые осуществляются в Connector/NET.
Connector/NET 6.10 или 8.0.11.
MySQL Server 5.6.
Entity Framework 6 assemblies.
.NET Framework 4.5.1 (.NET Framework 4.5.2 для Connector/NET 8.0.22).
Connector/NET 8.0.22.
MySQL Server 5.6.
Entity Framework 6.4 assemblies.
.NET Standard 2.1 (.NET Core SDK 3.1 и Visual Studio 2019 16.5).
У версий MySQL Connector/NET 8.0 есть схема именования для EF6 assemblies и пакетов NuGet, которая отличается от схемы, используемой с предыдущим рядом выпусков, например, 6.9 и 6.10. Чтобы формировать Connector/NET 6.9 или 6.10 для использования с EF6, замените имена assembly и пакета в этой секции следующими:
Assembly: MySql.Data.Entity.EF6
Пакет NuGet: MySql.Data.Entity
Для получения дополнительной информации о пакете
MySql.Data.Entity NuGet package
и его использовании см.
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,
используйте одну из следующих опций инсталляции:
Command Line Interface (CLI):
dotnet add package MySql.Data.EntityFramework -Version 8.0.22
Package Manager Console (PMC):
Install-Package MySql.Data.EntityFramework -Version 8.0.22
Visual Studio с NuGet Package Manager. Для этого выбора надо выбрать
nuget.org как источник пакета, найти
mysql.data и установить стабильную версию
MySql.Data.EntityFramework.
MySQL Installer или файл 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
и добавить необходимые зависимости.
Следующее это новые особенности Entity Framework 6, реализованные в Connector/NET:
Кросс-платформенная поддержка в Connector/NET 8.0.22 реализован EF 6.4 как начальная версия поставщика, чтобы включать совместимость Linux и macOS с .NET Standard 2.1 от Microsoft.
Async Query and Save добавляет поддержку основанных на задаче асинхронных образцов, которые были доступны начиная с .NET 4.5. Новые асинхронные методы, поддержанные Connector/NET:
ExecuteNonQueryAsync
ExecuteScalarAsync
PrepareAsync
Connection Resiliency / Retry Logic
позволяет автоматическое восстановление от сбоев связи.
Чтобы использовать эту функцию, добавьте к методу
OnCreateModel:
SetExecutionStrategy(MySqlProviderInvariantName.ProviderName, () =>
new MySqlExecutionStrategy());
Code-Based Configuration дает вам выбор конфигурации в коде вместо того, чтобы выполнить его в конфигурационном файле, как это было сделано традиционно.
Dependency Resolution вводит поддержку Service Locator. Некоторые части функциональности, которая может быть заменена пользовательскими реализациями, были вынесены за скобки. Чтобы добавить зависимости, используйте:
AddDependencyResolver(new MySqlDependencyResolver());
Следующие зависимости могут быть добавлены:
DbProviderFactory -> MySqlClientFactory
IDbConnectionFactory ->
MySqlConnectionFactory
MigrationSqlGenerator ->
MySqlMigrationSqlGenerator
DbProviderServices ->
MySqlProviderServices
IProviderInvariantName ->
MySqlProviderInvariantName
IDbProviderFactoryResolver ->
MySqlProviderFactoryResolver
IManifestTokenResolver ->
MySqlManifestTokenResolver
IDbModelCacheKey ->
MySqlModelCacheKeyFactory
IDbExecutionStrategy ->
MySqlExecutionStrategy
Interception/SQL logging обеспечивает стандартные блоки низкого уровня для перехвата операций по 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 обеспечивает оптимизированный способ добавить или удалить многократные entities из набора.
Следующее новые возможности Code First, поддержанные Connector/NET:
Отображение Code First, чтобы выполнить Insert/Update/Delete Stored Procedures:
modelBuilder.Entity<EntityType>().MapToStoredProcedures();
Идемпотентные скрипты миграций
позволяют вам производить скрипт SQL, который может модернизировать базу
данных в любой версии до последней версии. Чтобы сделать это, выполните
Update-Database -Script -SourceMigration:
$InitialDatabase в Package Manager Console.
Конфигурируемая таблица истории миграций позволяет вам настраивать определение таблицы истории миграций.
Следующий пример кода 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# показывает как использовать entities из предыдущей модели в приложении, которое хранит данные в таблице 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;
}
}
}
}
}
MySQL Connector/NET объединяет поддержку Entity Framework Core (EF Core). Требования и конфигурация EF Core зависят от версии установленного Connector/NET и особенностей, которых вы требуете. Используйте эту таблицу, чтобы оценить минимальные требования.
Таблица 7.2. Версии Connector/NET и поддержка Entity Framework Core
| Connector/NET | EF Core 2.0 | EF Core 2.1 | EF Core 3.1.1 |
|---|---|---|---|
| 8.0.20 | Не поддерживается. | Не поддерживается. | .NET Standard 2.0 |
| С 8.0.18 до 8.0.19. | Не поддерживается. | .NET Standard 2.0 или .NET Framework 4.6.1 (и выше). | Не поддерживается. |
| С 8.0.13 до 8.0.17. | Не поддерживается. | .NET Standard 2.0 или .NET Framework 4.6.1 (и выше). | Не поддерживается. |
| С 8.0.11 до 8.0.12. | .NET Standard 2.0; Не поддерживается Scaffolding. | Не поддерживается. | Не поддерживается. |
| 6.10.8 | .NET Standard 2.0 или .NET Framework 4.6.1 (и выше). | Не поддерживается. | Не поддерживается. |
| С 6.10.5 до 6.10.7. | .NET Standard 2.0; Не поддерживается Scaffolding. | Не поддерживается. | Не поддерживается. |
Connector/NET 6.10 или 8.0 (см. таблицу 7.2).
MySQL Server 5.7.
Entity Framework Core (см. таблицу 7.2).
.NET (см. таблицу 7.2).
.NET Core SDK.
Microsoft Windows: https://www.microsoft.com/net/core#windowscmd.
Опционально: Microsoft Visual Studio 2015, 2017, 2019 или Code.
Для EF Core 3.1 Visual Studio 2019 версия 16.3 является минимальной.
Чтобы использовать Entity Framework Core с базой данных MySQL, сделайте следующее:
Установите пакет NuGet
MySql.Data.EntityFrameworkCore
.
Все пакеты установят дополнительные пакеты, требуемые, чтобы запустить ваше приложение. Для получения инструкций относительно добавления пакета NuGet см. соответствующую документацию Microsoft.
В классе, который происходит из DbContext,
перекройте метод OnConfiguring, чтобы установить
провайдера данных MySQL с помощью UseMySQL.
Следующий пример показывает, как установить поставщика, используя
универсальную строку подключения в C#.
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
# warning To protect potentially sensitive information in your connection string,
you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263
for guidance on storing connection strings.
optionsBuilder.UseMySQL("server=localhost;database=library;user=user;password=password");
}
Реализация Connector/NET EF Core имеет следующие ограничения:
Оптимизированные в памяти таблицы не поддерживаются.
Следующая таблица показывает максимальную длину строковых типов, поддержанных Connector/NET в EF Core. Значения длины даны в байтах для типов строки, в зависимости от используемого набора символов.
Таблица 7.3. Максимум длины строк в Entity Framework Core
| Тип данных | Максимальная длина | Тип в .NET |
|---|---|---|
CHAR |
255 | string |
BINARY |
255 | byte[] |
VARCHAR,
VARBINARY | 65,535 | string,
byte[] |
TINYBLOB,
TINYTEXT | 255 | byte[] |
BLOB,
TEXT | 65,535 | byte[] |
MEDIUMBLOB,
MEDIUMTEXT | 16,777,215 | byte[] |
LONGBLOB,
LONGTEXT | 4,294,967,295 | byte[] |
ENUM | 65,535 | string |
SET |
65,535 | string |
Для получения дополнительной информации о требованиях к хранению строковых типов данных посмотрите String Type Storage Requirements.
Code First позволяет вам определить модель entity в коде, создать базу данных из модели, а затем добавить данные. Данные, добавленные приложением, также могут быть получены с использованием MySQL Connector/NET.
Следующий пример показывает процесс создания базы данных из существующего кода. Хотя этот пример использует язык C#, можно выполнить его в Windows, macOS или Linux.
Создайте консольное приложение для этого примера.
Инициализируйте действительный проект .NET Core
и консольное приложение, используя .NET Core command-line interface (CLI),
а затем переключитесь на недавно созданный каталог
(mysqlefcore).
dotnet new console Б─⌠o mysqlefcorecd mysqlefcore
Добавьте пакет MySql.Data.EntityFrameworkCore
, используя CLI следующим образом:
dotnet add package MySql.Data.EntityFrameworkCore --version 8.0.20
Альтернативно, можно использовать в Visual Studio, чтобы добавить пакет.
Install-Package MySql.Data.EntityFrameworkCore -Version 8.0.20
Версия (например, 8.0.20)
должна соответствовать фактической версии Connector/NET.
Для получения информации о текущей версии см.
таблицу
7.2.
Восстановите зависимости и определенные для проекта инструменты, которые определяются в файле проекта следующим образом:
dotnet restore
Создайте модель и запустите приложение.
Модель в этом примере EF Core будет использоваться консольным приложением.
Это состоит из двух entities, связанных с книжной библиотекой, которая будет
формироваться в классе LibraryContext
(или контексте базы данных).
Создайте новый файл
LibraryModel.cs
и затем добавьте следующте классы Book и
Publisher в пространство имен
mysqlefcore.
namespace mysqlefcore
{
public class Book
{
public string ISBN { get; set; }
public string Title { get; set; }
public string Author { get; set; }
public string Language { get; set; }
public int Pages { get; set; }
public virtual Publisher Publisher { get; set; }
}
public class Publisher
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Book> Books { get; set; }
}
}
Создайте новый файл LibraryContext.cs
и добавьте код, который показан ниже. Замените универсальную строку
подключения той, которая подходит для вашей конфигурации сервера MySQL.
Класс LibraryContext содержит
entities, чтобы использовать, и он позволяет конфигурацию определенных
признаков модели, таких как Key, необходимые колонки, ссылки и так далее.
using Microsoft.EntityFrameworkCore;
using MySQL.Data.EntityFrameworkCore.Extensions;
namespace mysqlefcore
{
public class LibraryContext : DbContext
{
public DbSet<Book> Book { get; set; }
public DbSet<Publisher> Publisher { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder
optionsBuilder)
{
optionsBuilder.UseMySQL("server=localhost;database=library;user=user;password=password");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Publisher>(entity =>
{
entity.HasKey(e => e.ID);
entity.Property(e => e.Name).IsRequired(); });
modelBuilder.Entity<Book>(entity =>
{
entity.HasKey(e => e.ISBN);
entity.Property(e => e.Title).IsRequired();
entity.HasOne(d => d.Publisher).WithMany(p => p.Books); });
}
}
}
Введите следующий код в существующий файл
Program.cs, заменяя код C# по умолчанию.
using Microsoft.EntityFrameworkCore;
using System;
using System.Text;
namespace mysqlefcore
{
class Program
{
static void Main(string[] args)
{
InsertData();
PrintData();
}
private static void InsertData()
{
using(var context = new LibraryContext())
{
// Creates the database if not exists
context.Database.EnsureCreated();
// Adds a publisher
var publisher = new Publisher
{
Name = "Mariner Books"
};
context.Publisher.Add(publisher);
// Adds some books
context.Book.Add(new Book
{ISBN = "978-0544003415", Title = "The Lord of the Rings",
Author = "J.R.R. Tolkien", Language = "English", Pages = 1216,
Publisher = publisher});
context.Book.Add(new Book
{ISBN = "978-0547247762", Title = "The Sealed Letter",
Author = "Emma Donoghue", Language = "English",
Pages = 416, Publisher = publisher});
// Saves changes
context.SaveChanges();
}
}
private static void PrintData()
{
// Gets and prints all books in database
using (var context = new LibraryContext())
{
var books = context.Book.Include(p => p.Publisher);
foreach(var book in books)
{
var data = new StringBuilder();
data.AppendLine($"ISBN: {book.ISBN}");
data.AppendLine($"Title: {book.Title}");
data.AppendLine($"Publisher: {book.Publisher.Name}");
Console.WriteLine(data.ToString());
}
}
}
}
}
Используйте следующие команды CLI, чтобы восстановить зависимости и затем запустить приложение.
dotnet restoredotnet run
Вывод запуска приложения представляется следующим примером:
ISBN: 978-0544003415 Title: The Lord of the Rings Publisher: Mariner Books ISBN: 978-0547247762 Title: The Sealed Letter Publisher: Mariner Books
Заготовки базы данных создают модель Entity Framework из существующей базы данных. Получающиеся entities созданы и отображены к таблицам в указанной базе данных. Эта особенность была введена в MySQL Connector/NET 6.10.2-beta и 8.0.8-dmr, однако, они не поддерживаются всеми версиями Connector/NET (см. таблицу 7.2).
Пакет Design это часть главного пакета в EF
Core 2.0 (и выше) и больше не отделяется. Если вы обновляетесь с EF Core 1.1
на EF Core 2.0 или 2.1, необходимо удалить вручную пакет
MySql.Data.EntityFrameworkCore.Design.
Пакеты NuGet имеют способность выбрать лучшую цель проекта, что означает, что NuGet установит библиотеки, связанные с той определенной версией структуры.
Есть два различных пути к заготовкам в существующей базе данных:
Эта секция показывает как использовать базу данных
sakila, используя оба подхода.
Любое внедрение .NET Standard (см. https://dotnet.microsoft.com/platform/dotnet-standard#versions ).
Visual Studio 2017 version 15.7 (нужно для Package Manager Console в Visual Studio).
MySQL Server 5.7.
Образец базы данных sakila (см.
https://dev.mysql.com/doc/sakila/en/).
Модернизируя приложения ASP.NET Core до более новой структуры, надо использовать соответствующую версию EF Core (см. https://docs.microsoft.com/en-us/aspnet/core/migration/30-to-31?view=aspnetcore-3.1).
Инициализируйте действительный проект .NET Core
и консольное приложение, используя .NET Core command-line interface (CLI) и
перейдите в созданный каталог
(в данном случае это sakilaConsole).
dotnet new console Б─⌠o sakilaConsolecd sakilaConsole
Добавьте пакет MySQL NuGet для EF Core через CLI.
Например, используйте следующую команду, чтобы добавить пакет
MySql.Data.EntityFrameworkCore v8.0.20:
dotnet add package MySql.Data.EntityFrameworkCore --version 8.0.20
Версия (например, --version
8.0.20) должна соответствовать фактической версии
Connector/NET. Для получения информации о текущей версии см.
таблицу
7.2.
Добавьте следующий пакет Nuget
Microsoft.EntityFrameworkCore.Design:
dotnet add package Microsoft.EntityFrameworkCore.Design
При использовании EF Core 2.0,
добавьте ссылку на
Microsoft.EntityFrameworkCore.Tools.DotNet
как запись DotNetCliToolReference в файле
sakilaConsole.csproj:
<ItemGroup> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.3"/> </ItemGroup>
Инструменты .NET включены в .NET Core 2.1 SDK (и выше)
и не требуются или поддерживаются для EF Core 2.1.
Если это модернизация, удалите ссылку на тот пакет из файла
.csproj (версия 2.0.3 в этом примере):
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.3" />
Восстановите зависимости и определенные для проекта инструменты, которые определяются в файле проекта следующим образом:
dotnet restore
Создайте модель Entity Framework Core, выполнив следующую команду
(приспособьте значения строки подключения, чтобы соответствовать вашим
параметрам настройки для опций user= и
password=):
dotnet ef dbcontext scaffold "server=localhost;port=3306;user=root;password=mypass;database=sakila" MySql.Data.EntityFrameworkCore -o sakila -f
Чтобы утвердить, что модель была создана, откройте новый каталог
sakila. Необходимо видеть, что файлы
соответствуют всем таблицам, отображенным к entities. Кроме того, ищите
файл sakilaContext.cs, который содержит
DbContext для этой базы данных.
Откройте Visual Studio и создайте новое Console App (.NET Core) для C#.
Добавьте пакет MySQL NuGet для EF Core, используя
.
Например, используйте следующую команду, чтобы добавить пакет
MySql.Data.EntityFrameworkCore v8.0.20:
Install-Package MySql.Data.EntityFrameworkCore -Version 8.0.20
Версия (например, -Version 8.0.20
) должна соответствовать фактической версии Connector/NET. См.
таблицу 7.2
.
Установите следующие пакеты NuGet, выбрав через или из меню и :
Microsoft.EntityFrameworkCore.Design
.
Microsoft.EntityFrameworkCore.Tools version
2.0.3 (для EF Core 2.0).
Инструменты .NET включены в .NET Core 2.1 SDK (и позже)
и не требуются или поддерживаются для EF Core 2.1.
Если это модернизация, удалите ссылку на этот пакет из файла
.csproj (в данном случае версия 2.0.3):
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.3" />
Откройте и
введите следующую команду, чтобы создать entities и
DbContext для базы данных
sakila (исправьте строку подключения, чтобы
соответствовать вашим параметрам настройки для опций
user= и
password=):
Scaffold-DbContext "server=localhost;port=3306;user=root;password=mypass;database=sakila" MySql.Data.EntityFrameworkCore -OutputDir sakila -f
Visual Studio создает новый каталог sakila
в проекте, который содержит все таблицы, отображенные к entities и
файл sakilaContext.cs.
Возможно определить точные таблицы в схеме, чтобы использовать в заготовках базы данных и опустить остальные. Примеры командной строки ниже показывают параметры, необходимые для фильтрации.
.NET Core CLI:
dotnet ef dbcontext scaffold \
"server=localhost;port=3306;user=root;password=mypass; \
database=sakila" MySql.Data.EntityFrameworkCore -o sakila \
-t actor -t film -t film_actor -t language -f
Package Manager Console в Visual Studio:
Scaffold-DbContext "server=localhost;port=3306;user=root;\
password=mypass;\
database=sakila" MySql.Data.EntityFrameworkCore \
-OutputDir Sakila -Tables actor, film, \
film_actor, language -f
Можно использовать больше, чем одну схему или базу данных. Обратите внимание на то, что у пользователя, применяемого, чтобы соединиться с сервером MySQL, должен быть доступ к каждой схеме, которая будет включена в контекст. Функциональность многократной схемы была введена в Connector/NET 6.10.3-rc и 8.0.9-dmr.
Следующие примеры командной строки показывают, как соединить схемы
sakila и world
в едином контексте.
.NET Core CLI:
dotnet ef dbcontext scaffold "server=localhost;port=3306;user=root; \
password=mypass; \
database=sakila" MySql.Data.EntityFrameworkCore -o sakila \
--schema sakila --schema world -f
Package Manager Console в Visual Studio:
Scaffold-DbContext "server=localhost;port=3306;user=root; \
password=mypass;\
database=sakila" MySql.Data.EntityFrameworkCore \
-OutputDir Sakila -Schemas sakila, world -f
Эта секция описывает, как изменить набор символов и сопоставление в моделе Entity Framework (EF) Core. Модификации, сделанные к модели, затрагивают таблицы и колонки, произведенные из вашего кода.
Есть два отличных подхода, доступные для формирования наборов символов и
сопоставлений в скриптах code first. Аннотация данных позволяет вам применить
признаки непосредственно к вашей модели EF Core. Альтернативно, можно
перекрыть метод OnModelCreating
в вашем классе DbContext и использовать код
fluent API, чтобы формировать определенные особенности модели.
Пример каждого подхода показан ниже.
Для получения дополнительной информации о поддерживаемых наборах символов и сопоставлениях, посмотрите Character Sets and Collations in MySQL.
Прежде чем можно будет аннотировать модель EF Core набором символов и признаками сопоставления, добавьте ссылку на следующее пространство имен в файле, который содержит модель entity:
using MySql.Data.EntityFrameworkCore.DataAnnotations;
Добавьте один или больше признаков
[MySqlCharset], чтобы хранить данные, используя
множество наборов символов и один или больше признаков
[MySqlCollation], чтобы выполнить сравнения
согласно множеству сопоставлений. В следующем примере класс
ComplexKey представляет
entity (или таблицу), а Key1,
Key2 и
CollationColumn представляют свойства
entity (или столбца).
[MySqlCharset("utf8")]
public class ComplexKey
{
[MySqlCharset("latin1")
public string Key1 { get; set; }
[MySqlCharset("latin1")]
public string Key2 { get; set; }
[MySqlCollation("latin1_spanish_ci")]
public string CollationColumn { get; set; }
}
Добавьте следующую директиву, чтобы сослаться на методы, связанные с конфигурацией сопоставления и набором символов:
using MySQL.Data.EntityFrameworkCore.Extensions;
Используя fluent API, модель EF Core остается неизменной. Fluent API перекрывает любое правило, установленное признаком.
public class ComplexKey
{
public string Key1 { get; set; }
public string Key2 { get; set; }
public string CollationColumn { get; set; }
}
В этом примере entity и различные свойства entity повторно формируются,
включая обычные отображения к наборам символов и сопоставлениям.
Этот подход использует методы
ForMySQLHasCharset и
ForMySQLHasCollation.
public class MyContext : DbContext
{
public DbSet<ComplexKey> ComplexKeys { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<ComplexKey>(e =>
{
e.HasKey(p => new { p.Key1, p.Key2 });
e.ForMySQLHasCollation("ascii_bin");
// defining collation at Entity level
e.Property(p => p.Key1).ForMySQLHasCharset("latin1");
// defining charset in a property
e.Property(p => p.CollationColumnFA).ForMySQLHasCollation("utf8_bin");
// defining collation in a property
});
}
}