Обнаружение отложенной загрузки в Entity Framework Core - PullRequest
0 голосов
/ 03 марта 2020

Entity Framework Core 3.1.2 - я включил UseLazyLoadingProxies на своем DbContext, чтобы обеспечить целостность данных, но я хочу вызвать исключение во время разработки, если оно используется.

Как выполнить какой-нибудь код каждый раз, когда EF Core загружает отношения лениво?

1 Ответ

1 голос
/ 03 марта 2020

Единственный способ, которым я знаю, это диагностика c сообщений. Смотрите пример здесь: https://www.domstamand.com/getting-feedback-from-entityframework-core-through-diagnostics.

Требуемый класс событий: https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.diagnostics.lazyloadingeventdata.

В DBContext приложения

#if DEBUG
    static ApplicationDbContext()
    {
        // In DEBUG mode we throw an InvalidOperationException
        // when the app tries to lazy load data.
        // In production we just let it happen, for data
        // consistency reasons.
        DiagnosticListener.AllListeners.Subscribe(new DbContextDiagnosticObserver());
    }
#endif

Затем класс для подключения к EF-уведомлениям

internal class DbContextDiagnosticObserver : IObserver<DiagnosticListener>
    {
        private readonly DbContextLazyLoadObserver LazyLoadObserver =
            new DbContextLazyLoadObserver();

        public void OnCompleted() { }

        public void OnError(Exception error) { }

        public void OnNext(DiagnosticListener listener)
        {
            if (listener.Name == DbLoggerCategory.Name)
                listener.Subscribe(LazyLoadObserver);
        }
    }

И, наконец, класс, который генерирует исключения при возникновении отложенной загрузки

internal class DbContextLazyLoadObserver : IObserver<KeyValuePair<string, object>>
    {
        public void OnCompleted() { }
        public void OnError(Exception error) { }

        public void OnNext(KeyValuePair<string, object> @event)
        {
            // If we see some Lazy Loading, it means the developer needs to
            // fix their code!
            if (@event.Key.Contains("LazyLoading"))
                throw new InvalidOperationException(@event.Value.ToString());
        }
    }
...