WebMoney: WMZ Z294115950220 WMR R409981405661 WME E134003968233 |
Visa 4274 3200 2453 6495 |
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 EF 6.4: Полная кросс-платформенная
поддержка в 8.0.22 и выше. EF6: Полная поддержка только в Windows 8.0.11 и выше.
EF Core 3.1.1: Полная поддержка в 8.0.20 и выше.
(Connector/NET 8.0.20 не поддерживает EF Core 2.0 или 2.1). EF Core 2.1: Полная поддержка в 8.0.13 и выше. EF Core 2.0: Частичная поддержка в 8.0.8 до 8.0.12
(Без scaffolding).
EF6: Полная поддержка в Windows.
EF Core 2.0: Полная поддержка в 6.10.8 и выше. Частичная поддержка в
6.10.5 до 6.10.7 (Без scaffolding).
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: Пакет NuGet: Для получения дополнительной информации о пакете
Чтобы формировать Connector/NET для EF6: Отредактируйте секции конфигурации в файле
Примените ссылку на сборку, используя один из следующих методов: Пакет NuGet. Установите пакет NuGet, чтобы добавить эту
ссылку автоматически в файл Command Line Interface (CLI): Package Manager Console (PMC): Visual Studio с NuGet Package Manager. Для этого выбора надо выбрать
MySQL Installer или файл MSI MySQL Connector/NET.
Установите MySQL Connector/NET и затем добавьте ссылку для
Исходные тексты MySQL Connector/NET.
Соберите Connector/NET из исходных текстов
и затем вставьте следующую информацию о провайдере данных в файл
Всегда обновляйте номер версии, чтобы соответствовать ему в сборке
Установите новый класс Добавлением Вызовом Установкой типа Также возможно создать класс Следующее это новые особенности 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: Connection Resiliency / Retry Logic
позволяет автоматическое восстановление от сбоев связи.
Чтобы использовать эту функцию, добавьте к методу
Code-Based Configuration
дает вам выбор конфигурации в коде вместо того, чтобы выполнить
его в конфигурационном файле, как это было сделано традиционно. Dependency Resolution
вводит поддержку Service Locator. Некоторые части функциональности, которая
может быть заменена пользовательскими реализациями, были вынесены за скобки.
Чтобы добавить зависимости, используйте: Следующие зависимости могут быть добавлены:
Interception/SQL logging
обеспечивает стандартные блоки низкого уровня для перехвата операций по
Entity Framework с простой регистрацией SQL: DbContext теперь может быть создан с
DbConnection, который уже открыт, позволяет сценарии, где было бы
полезно, если бы связь могла бы быть открыта, создавая контекст (например,
разделение связи между компонентами, когда вы не можете
гарантировать состояние связи). Улучшенная поддержка транзакций
оказывает поддержку для транзакции, внешней к структуре, а также улучшенным
способам создать транзакцию в Entity Framework. Начиная с Entity Framework 6,
DbSet.AddRange/RemoveRange
обеспечивает оптимизированный способ добавить или удалить многократные
entities из набора. Следующее новые возможности Code First, поддержанные Connector/NET: Отображение Code First, чтобы выполнить
Insert/Update/Delete Stored Procedures: Идемпотентные скрипты миграций
позволяют вам производить скрипт SQL, который может модернизировать базу
данных в любой версии до последней версии. Чтобы сделать это, выполните
Конфигурируемая таблица истории миграций
позволяет вам настраивать определение таблицы истории миграций.
Следующий пример кода C# представляет структуру
модели Entity Framework 6. Пример кода C# показывает как использовать entities
из предыдущей модели в приложении, которое хранит данные в таблице MySQL. MySQL Connector/NET объединяет поддержку Entity Framework Core (EF Core).
Требования и конфигурация EF Core зависят от версии установленного
Connector/NET и особенностей, которых вы требуете. Используйте эту таблицу,
чтобы оценить минимальные требования. Таблица 7.2. Версии Connector/NET и поддержка
Entity Framework Core 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
Все пакеты установят дополнительные пакеты, требуемые, чтобы запустить
ваше приложение. Для получения инструкций относительно добавления пакета
NuGet см. соответствующую документацию
Microsoft. В классе, который происходит из Реализация Connector/NET EF Core имеет следующие ограничения: Оптимизированные в памяти таблицы не поддерживаются. Следующая таблица показывает максимальную длину строковых типов,
поддержанных Connector/NET в EF Core. Значения длины даны в байтах для типов
строки, в зависимости от используемого набора символов. Таблица 7.3. Максимум длины строк в Entity Framework Core Для получения дополнительной информации о требованиях к хранению строковых
типов данных посмотрите
String Type Storage Requirements.
Code First позволяет вам определить модель entity в коде,
создать базу данных из модели, а затем добавить данные.
Данные, добавленные приложением, также могут быть получены с
использованием MySQL Connector/NET. Следующий пример показывает процесс создания базы данных из
существующего кода. Хотя этот пример использует язык C#, можно выполнить его
в Windows, macOS или Linux. Создайте консольное приложение для этого примера. Инициализируйте действительный проект .NET Core
и консольное приложение, используя .NET Core command-line interface (CLI),
а затем переключитесь на недавно созданный каталог
( Добавьте пакет Альтернативно, можно использовать
Версия (например, Восстановите зависимости и определенные для проекта инструменты,
которые определяются в файле проекта следующим образом: Создайте модель и запустите приложение. Модель в этом примере EF Core будет использоваться консольным приложением.
Это состоит из двух entities, связанных с книжной библиотекой, которая будет
формироваться в классе Создайте новый файл
Создайте новый файл Класс Введите следующий код в существующий файл
Используйте следующие команды CLI, чтобы восстановить зависимости и
затем запустить приложение. Вывод запуска приложения представляется следующим примером: Заготовки базы данных создают модель Entity Framework
из существующей базы данных. Получающиеся entities созданы и отображены к
таблицам в указанной базе данных. Эта особенность была введена в
MySQL Connector/NET 6.10.2-beta и 8.0.8-dmr, однако, они
не поддерживаются всеми версиями Connector/NET (см.
таблицу
7.2). Пакет Пакеты NuGet имеют способность выбрать лучшую цель проекта, что означает,
что NuGet установит библиотеки, связанные с той
определенной версией структуры. Есть два различных пути к заготовкам в существующей базе данных: Эта секция показывает как использовать базу данных
Любое внедрение .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. Образец базы данных Модернизируя приложения 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) и
перейдите в созданный каталог
(в данном случае это Добавьте пакет MySQL NuGet для EF Core через CLI.
Например, используйте следующую команду, чтобы добавить пакет
Версия (например, Добавьте следующий пакет Nuget
При использовании EF Core 2.0,
добавьте ссылку на
Инструменты .NET включены в .NET Core 2.1 SDK (и выше)
и не требуются или поддерживаются для EF Core 2.1.
Если это модернизация, удалите ссылку на тот пакет из файла
. Восстановите зависимости и определенные для проекта инструменты,
которые определяются в файле проекта следующим образом: Создайте модель Entity Framework Core, выполнив следующую команду
(приспособьте значения строки подключения, чтобы соответствовать вашим
параметрам настройки для опций Чтобы утвердить, что модель была создана, откройте новый каталог
Откройте Visual Studio и создайте новое
Console App (.NET Core) для C#. Добавьте пакет MySQL NuGet для EF Core, используя
Версия (например, Установите следующие пакеты NuGet, выбрав через
Инструменты .NET включены в .NET Core 2.1 SDK (и позже)
и не требуются или поддерживаются для EF Core 2.1.
Если это модернизация, удалите ссылку на этот пакет из файла
. Откройте Visual Studio создает новый каталог Возможно определить точные таблицы в схеме, чтобы использовать в
заготовках базы данных и опустить остальные. Примеры командной строки ниже
показывают параметры, необходимые для фильтрации. .NET Core CLI: Package Manager Console в Visual Studio: Можно использовать больше, чем одну схему или базу данных.
Обратите внимание на то, что у пользователя, применяемого, чтобы соединиться
с сервером MySQL, должен быть доступ к каждой схеме, которая будет включена в
контекст. Функциональность многократной схемы была введена в Connector/NET
6.10.3-rc и 8.0.9-dmr. Следующие примеры командной строки показывают, как соединить схемы
.NET Core CLI: Package Manager Console в Visual Studio: Эта секция описывает, как изменить набор символов и сопоставление
в моделе Entity Framework (EF) Core. Модификации, сделанные к модели,
затрагивают таблицы и колонки, произведенные из вашего кода. Есть два отличных подхода, доступные для формирования наборов символов и
сопоставлений в скриптах code first. Аннотация данных позволяет вам применить
признаки непосредственно к вашей модели EF Core. Альтернативно, можно
перекрыть метод Для получения дополнительной информации о поддерживаемых наборах символов
и сопоставлениях, посмотрите
Character Sets and Collations in MySQL. Прежде чем можно будет аннотировать модель EF Core набором символов и
признаками сопоставления, добавьте ссылку на следующее пространство имен в
файле, который содержит модель entity: Добавьте один или больше признаков
Добавьте следующую директиву, чтобы сослаться на методы, связанные с
конфигурацией сопоставления и набором символов: Используя fluent API, модель EF Core остается неизменной.
Fluent API перекрывает любое правило, установленное признаком. В этом примере entity и различные свойства entity повторно формируются,
включая обычные отображения к наборам символов и сопоставлениям.
Этот подход использует методы
Глава 7. Connector/NET для Entity Framework
Версия Connector/NET
EF6 | EF 6.4 EF Core 8.0
6.10
7.1. Поддержка Entity Framework 6
Минимальные требования для EF6 только в Windows
Минимальные требования для EF 6.4 с поддержкой Cross-Platform
Конфигурация
MySql.Data.Entity.EF6
MySql.Data.Entity
MySql.Data.Entity
NuGet package
и его использовании см.
https://www.nuget.org/packages/MySql.Data.Entity/.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>
app.config
или
web.config
во время установки.
Например, чтобы установить пакет для Connector/NET 8.0.22,
используйте одну из следующих опций инсталляции:
dotnet add package MySql.Data.EntityFramework -Version 8.0.22
Install-Package MySql.Data.EntityFramework -Version 8.0.22
nuget.org
как источник пакета, найти
mysql.data
и установить стабильную версию
MySql.Data.EntityFramework
.MySql.Data.EntityFramework
к вашему проекту. В зависимости от используемой версии .NET Framework,
сборка берется из каталога v4.0
,
v4.5
или
v4.8
.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
ExecuteNonQueryAsync
ExecuteScalarAsync
PrepareAsync
OnCreateModel
:
SetExecutionStrategy(MySqlProviderInvariantName.ProviderName, () =>
new MySqlExecutionStrategy());
AddDependencyResolver(new MySqlDependencyResolver());
DbProviderFactory -> MySqlClientFactory
IDbConnectionFactory ->
MySqlConnectionFactory
MigrationSqlGenerator ->
MySqlMigrationSqlGenerator
DbProviderServices ->
MySqlProviderServices
IProviderInvariantName ->
MySqlProviderInvariantName
IDbProviderFactoryResolver ->
MySqlProviderFactoryResolver
IManifestTokenResolver ->
MySqlManifestTokenResolver
IDbModelCacheKey ->
MySqlModelCacheKeyFactory
IDbExecutionStrategy ->
MySqlExecutionStrategy
myContext.Database.Log = delegate(string message) { Console.Write(message); };
[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))
{
...
}
}
Database.ExecuteSqlCommand()
обернет по умолчанию команду в транзакцию, если транзакции еще нет.
Есть перегрузки этого метода, которые позволяют пользователям отвергать это
поведение. Выполнение хранимых процедур, включенное в модель через такие API,
как ObjectContext.ExecuteFunction()
, делает то
же самое. Также возможно передать
существующую транзакцию к контексту.Возможности Code First
modelBuilder.Entity<EntityType>().MapToStoredProcedures();
Update-Database -Script -SourceMigration:
$InitialDatabase
в Package Manager Console.Пример применения EF6
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; }
}
}
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;
}
}
}
}
}
7.2. Поддержка 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.
Не поддерживается. Не поддерживается.
Минимальные требования для основной поддержки EF Core
Настройка с MySQL
MySql.Data.EntityFrameworkCore
.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
");
}
Ограничения
Максимальная длина строки
Тип данных
Максимальная длина
Тип в .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
7.2.1. Создание базы данных с Code First в EF Core
mysqlefcore
).
dotnet new console Б─⌠o mysqlefcore
cd mysqlefcore
MySql.Data.EntityFrameworkCore
, используя CLI следующим образом:
dotnet add package MySql.Data.EntityFrameworkCore --version 8.0.20
Install-Package MySql.Data.EntityFrameworkCore -Version 8.0.20
8.0.20
)
должна соответствовать фактической версии Connector/NET.
Для получения информации о текущей версии см.
таблицу
7.2.
dotnet restore
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());
}
}
}
}
}
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
7.2.2. Заготовки в существующей базы данных в EF Core
Design
это часть главного пакета в EF
Core 2.0 (и выше) и больше не отделяется. Если вы обновляетесь с EF Core 1.1
на EF Core 2.0 или 2.1, необходимо удалить вручную пакет
MySql.Data.EntityFrameworkCore.Design
.sakila
, используя оба подхода.
Минимальные требования
sakila
(см.
https://dev.mysql.com/doc/sakila/en/).
Использование .NET Core CLI
sakilaConsole
).
dotnet new console Б─⌠o sakilaConsole
cd sakilaConsole
MySql.Data.EntityFrameworkCore v8.0.20
:
dotnet add package MySql.Data.EntityFrameworkCore --version 8.0.20
--version
8.0.20
) должна соответствовать фактической версии
Connector/NET. Для получения информации о текущей версии см.
таблицу
7.2.Microsoft.EntityFrameworkCore.Design
:
dotnet add package Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.Tools.DotNet
как запись DotNetCliToolReference
в файле
sakilaConsole.csproj
:
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.3"/>
</ItemGroup>
csproj
(версия 2.0.3 в этом примере):
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.3" />
dotnet restore
user=
и
password=
):
dotnet ef dbcontext scaffold "server=localhost;port=3306;user=root;password=
mypass
;database=sakila" MySql.Data.EntityFrameworkCore -o sakila -fsakila
. Необходимо видеть, что файлы
соответствуют всем таблицам, отображенным к entities. Кроме того, ищите
файл sakilaContext.cs
, который содержит
DbContext
для этой базы данных.
Применение Package Manager Console в Visual Studio
MySql.Data.EntityFrameworkCore v8.0.20
:
Install-Package MySql.Data.EntityFrameworkCore -Version 8.0.20
-Version 8.0.20
) должна соответствовать фактической версии Connector/NET. См.
таблицу 7.2
.Microsoft.EntityFrameworkCore.Design
.Microsoft.EntityFrameworkCore.Tools version
2.0.3
(для EF Core 2.0).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 -fsakila
в проекте, который содержит все таблицы, отображенные к entities и
файл sakilaContext.cs
.
Заготовки базы данных, фильтруя таблицы
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
Scaffold-DbContext "server=localhost;port=3306;user=root;\
password=
mypass
;\
database=sakila" MySql.Data.EntityFrameworkCore \
-OutputDir Sakila -Tables actor, film, \
film_actor, language -f
Заготовки с многочисленными схемами
sakila
и world
в едином контексте.
dotnet ef dbcontext scaffold "server=localhost;port=3306;user=root; \
password=
mypass
; \
database=sakila" MySql.Data.EntityFrameworkCore -o sakila \
--schema sakila --schema world -f
Scaffold-DbContext "server=localhost;port=3306;user=root; \
password=
mypass
;\
database=sakila" MySql.Data.EntityFrameworkCore \
-OutputDir Sakila -Schemas sakila, world -f
7.2.3. Формирование наборов символов и сопоставлений в EF Core
OnModelCreating
в вашем классе DbContext
и использовать код
fluent API, чтобы формировать определенные особенности модели.
Пример каждого подхода показан ниже.Использование аннотации данных
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; }
}
Применение Code-First Fluent API
using MySQL.Data.EntityFrameworkCore.Extensions;
public class ComplexKey
{
public string Key1 { get; set; }
public string Key2 { get; set; }
public string CollationColumn { get; set; }
}
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
});
}
}
Найди своих коллег! |
Вы можете направить письмо администратору этой странички, Алексею Паутову.