如何访问数据库上下文接口的数据库字段?
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; }
在那之后,我按照我在问题的最后一个代码部分中想要的方式使用了它。一切都像一个魅力!我不知道这是否是最好的方法,但它对我有用。
我正在使用 .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; }
在那之后,我按照我在问题的最后一个代码部分中想要的方式使用了它。一切都像一个魅力!我不知道这是否是最好的方法,但它对我有用。