Как настроить множественные отношения «многие ко многим» для одной таблицы, используя EntityFrameworkCore - PullRequest
0 голосов
/ 26 апреля 2018

В настоящее время я работаю над проектом CMS, в котором нам нужно отслеживать действия пользователя, когда он редактирует контент в бэкэнде.Такие действия, как создание, обновление или удаление контента.У меня есть идея, как я хотел бы реализовать это отслеживание активности, но я не могу найти решение, как воспроизвести это в коде.Для этой части проекта еще нет кода, но вот обзор компонентов:

Проект находится в .NET Core 2, DB - MSSQL.И DbContext создается с помощью команды dotnet ef scaffold (сначала DB).На данный момент есть три основных типа контента, которые пользователь может редактировать: события, статьи и страницы, каждый из которых имеет свою собственную таблицу в БД.Моя идея сохранения активности пользователя заключается в таблице с именем UserActivity, и минимально хотелось бы, чтобы она выглядела следующим образом:

UserActivity
--------------------
userId (int)
activityTypeId (int)
recordId (int)
recordTypeId (int)
date (datetime)

activityTypeId будет отображаться в таблицу UserActivityType с записями, такими как «Создано»., »« Обновлено »,« Удалено ». recordTypeId будет отображаться на 1 = Article, 2 = Event и 3 = Page.

Я не уверен, что смогу правильно объяснить свой вопрос,но возможно ли в EntityFrameworkCore настроить объекты «Событие», «Статья» и «Страница», чтобы каждый из них имел отношение «многие ко многим» к объекту UserActivity, имея столбец recordId в качестве внешнего ключа и ограничение значения для столбца recordTypeId?Это вообще возможно в MSSQL?Чтобы прояснить этот вопрос, вот несколько примеров записей.

Допустим, у меня есть запись Article с идентификатором x, запись Event с идентификатором y и запись Page с идентификатором z.Таким образом, некоторые примеры записей в таблице UserActivity будут выглядеть так:

userId | activityTypeId | recordId | recordTypeId |       date
--------------------------------------------------------------
    99 |              1 |        x |            1 | 2018-04-15
    97 |              2 |        x |            1 | 2018-04-14
    99 |              1 |        y |            2 | 2018-04-13
    97 |              3 |        y |            2 | 2018-04-12
    99 |              2 |        z |            3 | 2018-04-11
    97 |              2 |        z |            3 | 2018-04-10

Я знаю, что есть другие решения этой проблемы, такие как создание отдельных таблиц действий для каждого из типов содержимого Article, Event и Page, нов идеале я хотел бы отслеживать это в одной таблице, а в идеале я хотел бы использовать операторы linq select, которые автоматически сопоставляются с их свойствами навигации.

Другое решение - добавить столбцы внешнего ключа для каждого из них.типы контента в таблицу UserActivity, такие как articleId, eventId и pageId.Тем не менее, количество столбцов будет увеличиваться с увеличением количества типов содержимого, которое мы добавляем, и оно может стать загроможденным.

Любые отзывы и предложения приветствуются!

...