Недопустимое исключение приведения при ведении журнала аудита из нескольких таблиц в одну таблицу аудита EF - PullRequest
0 голосов
/ 30 октября 2018

Мое приложение использует Audit.NET с Audit.EntityFramework для изменения данных журнала аудита. В целях упрощения создания журнала аудита / визуализации изменений данных я решил записать изменения из нескольких таблиц в одну. Короче говоря: я определил конечный автомат для своего элемента, и я регистрирую, что происходит с ним с момента его первого появления в моей системе и до момента его утилизации.

Чтобы продемонстрировать проблемы, с которыми я борюсь, я создал тестовое приложение REST и сделал его доступным в GitHub репозитории .

Приложение отслеживает время жизни статей, когда статья может поступить в систему:

  • статья непосредственно добавляется и связывается с публикацией - короче говоря, она ПРИНЯТА
  • добавлено предложение статьи - короче, оно ПРЕДЛОЖЕНО
  • ПРЕДЛАГАЕМАЯ статья может быть принята для добавления в публикацию - короче, это ACCEPT_PROPOSAL

Для получения более подробной информации, проверьте public enum ProcessAction.

Как воспроизвести

  1. Клон репо
  2. Создание БД, а пользовательский код создания SQL содержится в комментарии в TestDbContext.cs
  3. Запустить миграцию БД
  4. Запустить приложение
  5. Позвоните всем конечным точкам с TestsController.cs в порядке их появления - вот прямые ссылки (HTTP GET):
    1. Mew Публикация: http://localhost:5000/tests/publication/add?name=New%20Publication
    2. Добавить артикул: http://localhost:5000/tests/article/add?type=ReviewArticle&title=Test%20article%202018&note=My%20test%20note&publicationId=1
    3. Предложить статью: http://localhost:5000/tests/proposal/add?type=ReviewArticle&title=Test предложение 1 и примечание = предложение% 20note% 201
    4. Примите предложение по статье (ПРИМЕЧАНИЕ: идентификатор статьи может отличаться в вашей системе): http://localhost:5000/tests/accept/1?publicationId=2

Вопросы

  1. Последний вызов вызывает следующее исключение:

    InvalidCastException: Unable to cast object of type
    'si.dezo.test.DotNetAudit.Models.Article' to type
    'si.dezo.test.DotNetAudit.Models.ArticleProposal'.
    
  2. Я закомментировал несколько строк кода в TestDbContext.cs и пометил его как

    ПРИМЕЧАНИЕ: ниже не работает

Я что-то не так делаю, или это ограничение или ошибка библиотеки?

Есть ли способ обойти проблему?

1 Ответ

0 голосов
/ 31 октября 2018

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

Когда вы звоните .Map с таким действием:

.Map<Article, Audit_Article>((evt, entry, auditTbl) => { /*some action*/ })

Будет сохранено действие, относящееся к типу Audit_Article, но ваш следующий вызов:

.Map<ArticleProposal, Audit_Article>((item, auditTbl) => { /*overriding action*/ })

отменит ваше предыдущее действие для любого типа, который отображается на Audit_Article.

Итак, моя первоначальная рекомендация - использовать общее действие через .AuditEntityAction<IAudit>. Это вызывает у вас какие-либо проблемы?

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

UPDATE

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

...