Привет, читатель, если ты нашел эту статью, то, вероятно, у тебя такая же задача, как и у меня в проекте. Причина, по которой я хотел перейти на свободный синтаксис API, заключалась в том, что в будущем это позволит мне гораздо проще перенести проект на .Net Core.
Для этого я собираюсь написать собственный мигратор, потому что я не нашел решений, которые могли бы выполнить миграцию. Я видел несколько примеров создания базы данных из файла EDMX, а затем применил подход сначала база данных для генерации кода из вновь созданной базы данных. Посмотреть можно здесь: Модель существующей базы данных. На самом деле у меня это не сработало, потому что в проекте у меня был подход сначала база данных, поэтому вновь созданная база данных из файла EDMX немного отличалась от существующей.
Итак, моя цель — дать вам краткий обзор файловой структуры EDMX и создать собственный инструмент миграции. Исходный код будет находиться в репозитории: Edmx-To-fluentApi-Migrator.
Что такое файл EDMX?
EDMX — это файл модели данных объекта в формате xml, который определяет сопоставления между таблицами базы данных и объектами в нашем коде. Он состоит из трех основных частей:
- CSDL (язык определения концептуальной схемы) — определяет структуру сущностей приложения.
- SSDL (язык определения схемы хранилища) — определяет структуру таблиц базы данных.
- MSL (язык схемы сопоставления) — определяет сопоставления между таблицами и сущностями.
Это минимальные знания, необходимые для понимания того, о чем я собираюсь написать. Думаю, единственная недостающая часть — это примеры, но вы увидите их в разделе реализации. Давай сделаем это!
Создайте базу данных и сгенерируйте файл EDMX
Во-первых, давайте взглянем на схему базы данных, потому что, как я уже упоминал ранее, у меня был подход сначала база данных. Как вы можете видеть на диаграмме ниже, нам приходится обрабатывать все типы отношений: один-к-одному, один-ко-многим и многие-ко-многим. Нажмите здесь, чтобы узнать больше об отношениях в SQL:

Давайте сгенерируем файл EDMX из этой базы данных:

Как видите, генератор EF добавляет комментарии к разделам, так что приступим к кодированию!
Создание миграции
Microsoft уже определила классы для работы с файлом EDMX. Его можно найти в пространствах имен System.Data.Entity.Core.Metadata.Emd и System.Data.Entity.Core.Mapping. И самые важные занятия для меня
- EdmItemCollection — анализирует и хранит информацию об сущностях, являющихся частью CSDL;
- StoreItemCollection — анализирует и сохраняет информацию о таблицах, являющихся частью SSDL;
- StorageMappingItemCollection — анализирует и строит отношения между сущностями приложения и таблицами базы данных, которая является MSL.
Прежде всего, я хочу разделить процесс на две основные части: проанализировать файл EDMX и создать файлы с синтаксисом FluentApi.
Я хочу создать процессоры, один из которых будет EdmxFileProcessor, а второй — FluentApiProcessor. Давайте определим общий интерфейс:
public interface IProcessor
{
void Process(ProcessorContext context);
}
И создадим наш конвейер процессора:
var logger = NLog.LogManager.GetCurrentClassLogger();
try
{
var context = new ProcessorContext();
var processors = new List<IProcessor> { new EdmxFileProcessor(), new FluentApiProcessor() };
foreach (var processor in processors)
{
processor.Process(context);
}
}
catch (Exception ex)
{
logger.Error(ex, "Error occurred during migration proccess");
}
finally
{
NLog.LogManager.Shutdown();
}
Существует также файл контекста, который мы можем использовать на разных процессорах.
public class ProcessorContext
{
public string EdmxFilePath { get; set; }
}
Окончательная структура приложения:

Думаю, для этой статьи этого достаточно. Мы рассмотрели основы файла EDMX, его разделы и структуру проекта, который я хочу создать. В следующей статье я покажу вам, как анализировать файл EDMX и использовать проанализированную информацию для создания синтаксиса FluentApi.