Каков наилучший способ аудита чтения сущностей с LinQ в EF6? - PullRequest
0 голосов
/ 31 октября 2019

У меня есть настройка базы данных EF с первым кодом, доступ к которой осуществляется через контроллер OData с внешнего интерфейса.

Я пытаюсь проверить сущности, которые загружает пользователь.

Как перехватить материализованные сущности после выполнения LinQ?

Например:

var entity = _service.Queryable().FirstOrDefault(x => x.ID == key);

Я хочу добавить настраиваемое действие после того, как сущность материализована и у нее есть доступ

Я пытался использовать DbContext.Database.Log, но получаю только запросы, сгенерированные EF.

Ответы [ 2 ]

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

Вот способ сделать это с событием ObjectMaterialized

using (var context = new EntityContext())
{
    // could be set globally in the constructor
    var materialized = new List<object>();
    ((IObjectContextAdapter) context).ObjectContext.ObjectMaterialized += (sender, args) => materialized.Add(args.Entity);

    var list = context.Customers.ToList();

    FiddleHelper.WriteTable(materialized);      
}

Онлайн Пример: https://dotnetfiddle.net/yzmlSO

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

Решение было на самом деле простым.

Поскольку я хотел регистрировать только пользовательские запросы из внешнего интерфейса, я расширил контроллер OData, добавляя журналы аудита при каждом запросе объекта.

Таким образом,независимо от того, какая фильтрация LinQ выполняется в бэкэнде, я получаю доступ к результату запроса пользователя:

var entity = _service.Queryable().Where(x => x.ID == key);
Logger.AddAuditLog(entity);
//... continue execution

Надеюсь, это кому-нибудь поможет!

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