如何访问数据库上下文接口的数据库字段?

How can I access the Database field of a database context interface?

我正在使用 .NET Core 3.1。我有以下问题:我想在应用层做一个事务。我有一个 DbContext 接口,因为我不想访问我有 DbContext class 的基础设施层。在其他架构中,我能够访问数据库字段,因此能够访问事务,因为我正在注入 DbContext class。现在我正在注入我创建的 DbContext 接口,但我不知道如何添加必要的字段,结果可能使用来自 DbContext class 的数据库字段。 这里是 Infrastructure 层 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; }
   }

这里是Application层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();
      }
   }
   }

... how to have the possiblity to use transaction when using a DbContext interface.

如果您想使用接口,请创建并实现适当的方法并调用。

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();
    }
}

我找到了解决问题的方法。在界面中我添加了以下字段:

public DatabaseFacade Database { get; }

在那之后,我按照我在问题的最后一个代码部分中想要的方式使用了它。一切都像一个魅力!我不知道这是否是最好的方法,但它对我有用。