Разрыв строки при вызове исключения в вызывающей стороне вместо переопределенного метода - PullRequest
0 голосов
/ 12 декабря 2018

Я переопределил метод SaveChanges в DBContext для обнаружения таблиц с информацией «Создано / Обновление» и автоматически обработал обновление, например так:

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(), а скорее в вызывающей стороне этого метода?

1 Ответ

0 голосов
/ 12 декабря 2018

Поскольку это имеет тенденцию идти, я нашел решение через 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();
}

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

...