UnitOfWorkManager事务

ASP.NET Core下FreeSql的仓储事务

第一步:配置 Startup.cs 注入

引入包

  1. dotnet add package FreeSql
  2. dotnet add package FreeSql.DbContext
  3. dotnet add package FreeSql.Provider.MySqlConnector

配置 Startup.cs 注入

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. IConfigurationSection Mysql = Configuration.GetSection("Mysql");
  4. Fsql = new FreeSqlBuilder()
  5. .UseConnectionString(DataType.MySql, Mysql.Value)
  6. .UseAutoSyncStructure(true)
  7. .UseNameConvert(NameConvertType.PascalCaseToUnderscoreWithLower)
  8. .UseMonitorCommand(cmd => Trace.WriteLine(cmd.CommandText))
  9. .Build();
  10. services.AddSingleton<IFreeSql>(fsql);
  11. services.AddScoped<UnitOfWorkManager>();
  12. services.AddFreeRepository(null, typeof(Startup).Assembly);
  13. //新增自己的服务,这里只有实现
  14. services.AddScoped<TransBlogService>();
  15. }
  • appsettings.json
    1. {
    2. "Mysql": "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=ovov_freesql_repository;Charset=utf8;SslMode=none;Max pool size=10",
    3. }
UnitOfWorkManager 成员 说明
IUnitOfWork Current 返回当前的工作单元
void Binding(repository) 将仓储的事务交给它管理
IUnitOfWork Begin(propagation, isolationLevel) 创建工作单元
  • TransBlogService.cs ```csharp private readonly IBaseRepository _blogRepository; private readonly IBaseRepository _tagRepository; private readonly UnitOfWorkManager _unitOfWorkManager;

public TransBlogService(IBaseRepository blogRepository, IBaseRepository tagRepository,UnitOfWorkManager unitOfWorkManager) { _blogRepository = blogRepository ; _tagRepository = tagRepository ; _unitOfWorkManager = unitOfWorkManager; }

public async Task CreateBlogUnitOfWorkAsync(Blog blog,ListtagList) { using (IUnitOfWork unitOfWork = _unitOfWorkManager.Begin()) { try { await _blogRepository.InsertAsync(blog); tagList.ForEach(r => { r.PostId = blog.Id; }); await _tagRepository.InsertAsync(tagList); unitOfWork.Commit(); } catch (Exception e) {
//实际 可以不Rollback。因为IUnitOfWork内部Dispose,会把没有Commit的事务Rollback回来,但能提前Rollback

  1. unitOfWork.Rollback();
  2. //记录日志、或继续throw;出来
  3. }
  4. }

}

public async Task UpdateBlogAsync(int id) { using (IUnitOfWork unitOfWork = _unitOfWorkManager.Begin()) { try { Blog blog = _blogRepository.Select.Where(r => r.Id == id).First(); blog.IsDeleted = true; await _blogRepository.UpdateAsync(blog); unitOfWork.Commit(); } catch (Exception e) { //记录日志、或继续throw;出来 unitOfWork.Rollback(); } } }

  1. | IUnitOfWork 成员 | 说明 |
  2. | ----------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
  3. | IFreeSql Orm | 该对象 Select/Delete/Insert/Update/InsertOrUpdate 与工作单元事务保持一致,可省略传递 WithTransaction |
  4. | DbTransaction GetOrBeginTransaction() | 开启事务,或者返回已开启的事务 |
  5. | void Commit() | 提交事务 |
  6. | void Rollback() | 回滚事务 |
  7. | DbContext.EntityChangeReport EntityChangeReport | 工作单元内的实体变化跟踪 |
  8. | Dictionary\<string, object\> States | 用户自定义的状态数据,便于扩展 |
  9. #### 完整的代码
  10. - [Blog.cs](https://github.com/luoyunchong/dotnetcore-examples/blob/master/ORM/FreeSql/OvOv.Core/Domain/Blog.cs)
  11. - [Tag.cs](https://github.com/luoyunchong/dotnetcore-examples/blob/master/ORM/FreeSql/OvOv.Core/Domain/Tag.cs)
  12. - [TransBlogService.cs](https://github.com/luoyunchong/dotnetcore-examples/blob/master/ORM/FreeSql/OvOv.FreeSql.AutoFac.DynamicProxy/Services/TransBlogService.cs)
  13. 以上使用的是泛型仓储,那我们如果是重写一个仓储 如何保持和``UnitOfWorkManager``同一个事务呢。
  14. 继承现有的``DefaultRepository<,>``仓储,实现自定义的仓储``BlogRepository.cs``,
  15. ```csharp
  16. public class BlogRepository : DefaultRepository<Blog, int>, IBlogRepository
  17. {
  18. public BlogRepository(UnitOfWorkManager uowm) : base(uowm?.Orm, uowm)
  19. {
  20. }
  21. public List<Blog> GetBlogs()
  22. {
  23. return Select.Page(1, 10).ToList();
  24. }
  25. }

其中接口。IBlogRepository.cs

  1. public interface IBlogRepository : IBaseRepository<Blog, int>
  2. {
  3. List<Blog> GetBlogs();
  4. }

在 startup.cs注入此服务

  1. services.AddScoped<IBlogRepository, BlogRepository>();