Привет, читатель, если ты нашел эту статью, то, вероятно, у тебя такая же задача, как и у меня в проекте. Причина, по которой я хотел перейти на свободный синтаксис API, заключалась в том, что в будущем это позволит мне гораздо проще перенести проект на .Net Core.

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

Итак, моя цель — дать вам краткий обзор файловой структуры EDMX и создать собственный инструмент миграции. Исходный код будет находиться в репозитории: Edmx-To-fluentApi-Migrator.

Что такое файл EDMX?

EDMX — это файл модели данных объекта в формате xml, который определяет сопоставления между таблицами базы данных и объектами в нашем коде. Он состоит из трех основных частей:

  1. CSDL (язык определения концептуальной схемы) — определяет структуру сущностей приложения.
  2. SSDL (язык определения схемы хранилища) — определяет структуру таблиц базы данных.
  3. 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.