Как совместно использовать модули EF в DbContext / Schemas (или достичь того же результата) - PullRequest
0 голосов
/ 04 июня 2019

Мне бы хотелось получить руководство по совместному использованию сущностей для нескольких DbContext с или найти альтернативное решение, которое решило бы одну и ту же задачу.

Мы используем EF Core для разработки системы DDDсостоит из нескольких логических модулей (Core, Foo, Bar, ...), каждый со своей DbContext / схемой и именем ConnectionString для одной и той же базы данных (но во многих случаях не требуется, чтобы все модули совместно использовалитот же дБ, если только в случае, описанном ниже).

Основной задачей было бы иметь возможность иметь модули, разработанные сторонними разработчиками (возможно, DotNetNuke?), которые управляют своими собственными схемами, не нарушая работу других поставщиков - при сохраненииабстракция, которую обеспечивает EF.

Базовый модуль предназначен для управления system Доменными проблемами (Diagnostics, Errors, Tenancy, Sessions, SessionOperations, Users, Permissions, UserSecurityProfiles, Roles, Media и т. Д.)

Другие модули предназначены для отдельных бизнес проблем, относящихся к конкретной области (например, один может быть дляStudent, School, Courses и др. Услуги и организации).

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

Группы являются рекурсивными, и пользователи могут быть назначены на группы в различных ролях (Owner, Admin, ContactPerson, Member).User s может быть Enabled/Disabled и иметь элементы Name (Display, Given, Surname и т. Д.) И Email.

Это общая проблема, которую можно использовать во многих доменах,подходит для основного модуля.

Но другие логические модули и их отдельные DbContext могут иметь сущность, связанную с общим User.

В модуле SI (Информация об ученике), дляНапример, все Student с будут User с, поэтому могут наследоваться от User (или иметь свойство навигации).С другой стороны, в модуле CRM, например, не все Customer s будут User s, поэтому потребуется свойство навигации со значением NULL до User (я просто придумываю варианты использования здесь).

Отношение может быть

  • хрупким (например, просто поле в объекте Student, содержащее идентификатор пользователя, который метод может использовать для получения связанного пользователя).
  • navigable: например, у Student будет свойство навигации для основного пользователя.Преимущества в том, что могут быть разработаны запросы linq, использующие атрибуты пользователя.Например, можно выбрать всех учеников, которые являются включенными пользователями.Или найдите студента на основе его адреса электронной почты для входа в систему.

Мы попытались сделать следующее:

Мы попытались сделать StudentModelDescription в SIDbContext,это наследуется от UserModelDescription в модуле ядра CoreDbContext и настраивает схему определения модели так, чтобы она была «базовой», а не «SI», но, как и ожидалось, просто пытается удвоить Create Table и завершиться неудачей.

Мы не пытались добавить параметр CoreDbContext User к SIDbContext объекту Student, потому что, даже если он скомпилирован, SIDbContext не знал бы, извлекает ли ядро ​​User (что выходит за рамки его моделиопределение).

Мы рассмотрели вопрос о том, чтобы наследовать SIDbContext от CoreDbContext, а затем игнорировать создание таблиц Core и отключить миграцию / создание модели (чтобы не пытаться-создать таблицы).Это был рекомендуемый курс в EF6, но это может свести на нет возможность для каждого поставщика иметь возможность добавлять / извлекать свои модули без координации в том же DbContext ...

По сути, у нас нет идей о том, как действоватьв продолжение этой базовой концепции (без каламбура), задаюсь вопросом, предоставляет ли EF Core новые возможности для решения такой проблемы.

Спасибо за понимание и время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...