Как я могу получить доступ к полю базы данных контекстного интерфейса базы данных? - PullRequest
0 голосов
/ 22 апреля 2020

Я использую. NET Core 3.1. У меня следующая проблема: я хочу сделать транзакцию на уровне приложений. Там у меня есть интерфейс DbContext, потому что я не хочу иметь доступ к уровню инфраструктуры, где у меня есть класс DbContext. В других архитектурах мне удалось получить доступ к полю базы данных и, следовательно, к транзакции, потому что я внедрял класс DbContext. Сейчас я внедряю созданный мной интерфейс DbContext и не знаю, как добавить необходимые поля, в результате чего возможно использование поля Database из класса DbContext. Вот инфраструктурный уровень DbContext.

   public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, long>, IApplicationDbContext
   {
        private readonly ICurrentUserService _currentUserService;
        private readonly IDateTime _dateTime;
        public ApplicationDbContext(DbContextOptions options, ICurrentUserService currentUserService, IDateTime dateTime)
            : base(options)
        {
            _currentUserService = currentUserService;
            _dateTime = dateTime;
        }
        public DbSet<City> Cities { get; set; }
   }

А вот интерфейс DbContext прикладного уровня.

    public interface IApplicationDbContext
    {
       Task<int> SaveChangesAsync(CancellationToken cancellationToken);
       public DbSet<City> Cities { get; set; }
    }

Я хочу иметь возможность сделать что-то подобное

   public class CityService
   {
      private readonly IApplicationDbContext _context;
      public CityService(IApplicationDbContext context)
      {
         _context = context;
      }
   public Task AddAsync(City city, CancellationToken cancellationToken)
   {
      using var transaction = _context.Database.BeginTransaction();
      try
      {
         await _context.AddAsync(city, cancellationToken);
         await _context.SaveChangesAsync(cancellationToken);
         await transaction.CommitAsync();
      }
      catch (Exception e)
      {
         await transaction.RollbackAsync();
      }
   }
   }

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Я нашел решение для моей проблемы. В интерфейсе я добавил следующее поле:

public DatabaseFacade Database { get; }

После этого я использовал его так, как мне хотелось в последнем разделе кода из моего вопроса. Все работает как шарм! Я не знаю, является ли это лучшим способом сделать это, но это работает для меня.

1 голос
/ 22 апреля 2020

... как иметь возможность использовать транзакцию при использовании интерфейса DbContext.

Если вы хотите использовать интерфейс, то создайте и внедрите соответствующий метод и выполните вызов.

public interface IApplicationDbContext
{
   Task<int> SaveChangesAsync(CancellationToken cancellationToken);
   DbSet<City> Cities { get; set; }

   // added
   IDbContextTransaction BeginTransaction();
}

public class ApplicationDbContext : ... IApplicationDbContext
{
    // added
    public IDbContextTransaction BeginTransaction()
    {
        return _context.Database.BeginTransaction();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...