Я переопределил метод 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(), а не от вызывающей стороны этого метода?
@EricLippert Извините за путаницу, я нашел [System.Diagnostics.DebuggerStepThrough], что и пытался сделать. Я не уверен, как еще это объяснить, разрыв строки отладчика происходит в моем переопределенном методе SaveChanges(), но я хочу, чтобы код, который вызвал его на моем уровне репозитория, приводил к разрыву строки, поскольку вы можете вызывать SaveChanges() несколько раз в одном методе или последовательности методов.
Спасибо, в этом гораздо больше смысла. Кроме того, в некоторых версиях Visual Studio есть функция «только мой код», которая может заставить отладчик, как следует из названия, отображать только ваш код, а не код фреймворка. Вы можете убедиться, что эта функция отключена.





Как обычно, я нашел решение через 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();
}
Это "всплывает" исключение для вызывающей стороны, чтобы вам было легче отладить проблему. Однако я бы использовал это экономно, поскольку теперь метод будет сообщать об ошибках вне настраиваемого переопределения.
Я не понимаю, что вы имеете в виду, говоря «получить исключение в переопределенном методе, а не от вызывающего», и я не понимаю, при чем здесь отладчик. Вы можете более четко объяснить свою проблему? В идеале напишите небольшую, простую, полную программу, которая иллюстрирует поведение, о котором вы говорите, что мы может запускаться в отладчике.