如何解决这笔交易有效吗? ASP.NET 存储库模式
谢谢光临。 我是一个新的 C#、ASP .NET 程序员。我正在使用 PostgreSQL 和 ASP.NET 3.1 来构建一个后端网站。使用存储库模式,它进行得很顺利,然后出现了问题。
当我更新 2 个不同的实体 A 和 B 时。A 工作得很好,但 B 失败了。在正常情况下,应该删除 A 一个。但有些 A 仍然存在于数据库中。
所以我对事务、工作单元、工作单元 + 存储库模式进行了一些研究,...
然后我想出了一些理想,我想知道这是否可行。或者有什么问题、缺点、优点或者这个。
所以这是存储库,
public class BaseRepository<TEntity> where TEntity : class
{
public readonly GolfDbContext Context;
public readonly DbSet<TEntity> Entities;
public BaseRepository(GolfDbContext context)
{
Context = context;
Entities = Context.Set<TEntity>();
}
public void Add(TEntity entity)
{
Entities.Add(entity);
}
}
这是交易
public class DatabaseTransaction
{
protected readonly GolfDbContext Context;
private IDbContextTransaction transaction;
public DatabaseTransaction(GolfDbContext context)
{
Context = context;
}
public async Task<bool> Commit()
{
await this.transaction.CommitAsync();
return true;
}
public void BeginTransaction()
{
this.transaction = Context.Database.BeginTransaction();
}
public async void Rollback()
{
await this.transaction.RollbackAsync();
}
}
这是在启动文件中
{
....
services.AddTransient<RepoA>();
services.AddTransient<RepoB>();
services.AddTransient<ServiceC>();
services.AddTransient<DatabaseTransaction>();
services.AddHttpContextAccessor();
services.AddDbContext<DbContext>(options =>
options.UseNpgsql(
Configuration.GetConnectionString("MyWebApiConnection"))
));
...
}
这是在服务 C
public class ServiceC
{
private readonly RepoA _repoA;
private readonly RepoB _repoB;
private readonly DatabaseTransaction _dbtransaction;
public ServiceC(RepoA repoA,RepoB repoB,DatabaseTransaction dbtransaction)
{
_repoA = repoA,_repoB = repoB,_dbtransaction = dbtransaction
}
public async void Example(entityA a,entityB b)
{
try
{
_databaseTransaction.BeginTransaction();
repoA.Add(a);
repoB.Add(b);
await _databaseTransaction.Commit();
}
catch (Execption e)
{
_databaseTransaction.Rollback();
throw new Exception("Create Account Error: " + exception);
}
}
}
这意味着,我将在函数的第一行设置事务,如果 2 repoA.Add(a)
起作用而 repoB.Add(B)
不起作用,那么我们不能回滚并抛出异常,如果 2 个函数起作用,则 dbcontext 将成为 Commit()
和 SaveChanges()
感谢阅读
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。