В настоящее время я работаю над проектом 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
.Тем не менее, количество столбцов будет увеличиваться с увеличением количества типов содержимого, которое мы добавляем, и оно может стать загроможденным.
Любые отзывы и предложения приветствуются!