Строка разрыва при выдаче исключения в вызывающей стороне вместо переопределенного метода

Я переопределил метод SaveChanges в DBContext, чтобы обнаруживать таблицы с информацией Created / Update и автоматически обрабатывать обновление, например:

public partial class MyContext
{
    private readonly ITokenService _tokenService;

    public MyContext(ITokenService tokenService, DbContextOptions options) : base(options)
    {
        _tokenService = tokenService;
    }
    public override int SaveChanges()
    {
        var entities = ChangeTracker.Entries().Where(entry => entry.Entity is ITrackingEntities);
        foreach (var entityEntry in entities)
        {
            if (entityEntry.State == EntityState.Added)
            {
                ((ITrackingEntities) entityEntry.Entity).CreatedBy = _tokenService.LoginUserId;
                ((ITrackingEntities) entityEntry.Entity).CreatedDateUtc = DateTime.UtcNow;
            }

            ((ITrackingEntities) entityEntry.Entity).UpdatedBy = _tokenService.LoginUserId;
            ((ITrackingEntities) entityEntry.Entity).UpdatedDateUtc = DateTime.UtcNow;
        }
        return base.SaveChanges();
    }
}

Однако всякий раз, когда я пишу код EF, который вызывает исключение на моем уровне репозитория, разрыв строки исключения происходит в моем переопределенном методе SaveChanges(), а не в вызывающем методе репозитория, что затрудняет отладку, когда я вызываю SaveChanges() несколько раз в методе. .

Есть ли способ указать отладчику, чтобы он не прерывал строку в моем переопределенном методе SaveChanges(), а не от вызывающей стороны этого метода?

Я не понимаю, что вы имеете в виду, говоря «получить исключение в переопределенном методе, а не от вызывающего», и я не понимаю, при чем здесь отладчик. Вы можете более четко объяснить свою проблему? В идеале напишите небольшую, простую, полную программу, которая иллюстрирует поведение, о котором вы говорите, что мы может запускаться в отладчике.

Eric Lippert 12.12.2018 17:45

@EricLippert Извините за путаницу, я нашел [System.Diagnostics.DebuggerStepThrough], что и пытался сделать. Я не уверен, как еще это объяснить, разрыв строки отладчика происходит в моем переопределенном методе SaveChanges(), но я хочу, чтобы код, который вызвал его на моем уровне репозитория, приводил к разрыву строки, поскольку вы можете вызывать SaveChanges() несколько раз в одном методе или последовательности методов.

C Bauer 12.12.2018 17:48

Спасибо, в этом гораздо больше смысла. Кроме того, в некоторых версиях Visual Studio есть функция «только мой код», которая может заставить отладчик, как следует из названия, отображать только ваш код, а не код фреймворка. Вы можете убедиться, что эта функция отключена.

Eric Lippert 12.12.2018 17:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как обычно, я нашел решение через 5 минут после публикации вопроса. Для всех, кому нужна такая функциональность, атрибут [System.Diagnostics.DebuggerStepThrough] - это то, что вы ищете, так что метод, который я опубликовал, выглядит следующим образом:

[System.Diagnostics.DebuggerStepThrough]
public override int SaveChanges()
{
    var entities = ChangeTracker.Entries().Where(entry => entry.Entity is ITrackingEntities);
    foreach (var entityEntry in entities)
    {
        if (entityEntry.State == EntityState.Added)
        {
            ((ITrackingEntities) entityEntry.Entity).CreatedBy = _tokenService.LoginUserId;
            ((ITrackingEntities) entityEntry.Entity).CreatedDateUtc = DateTime.UtcNow;
        }

        ((ITrackingEntities) entityEntry.Entity).UpdatedBy = _tokenService.LoginUserId;
        ((ITrackingEntities) entityEntry.Entity).UpdatedDateUtc = DateTime.UtcNow;
    }
    return base.SaveChanges();
}

Это "всплывает" исключение для вызывающей стороны, чтобы вам было легче отладить проблему. Однако я бы использовал это экономно, поскольку теперь метод будет сообщать об ошибках вне настраиваемого переопределения.

Другие вопросы по теме