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 mysqlefcore
cd 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 restore
dotnet 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 sakilaConsole
cd 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" />
Откройте 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 }); } }