ASP.NET Core下FreeSql的仓储事务
2021/8/6 19:08:05
本文主要是介绍ASP.NET Core下FreeSql的仓储事务,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
ASP.NET Core下FreeSql的仓储事务
第一步:配置 Startup.cs 注入
引入包
dotnet add package FreeSql dotnet add package FreeSql.DbContext dotnet add package FreeSql.Provider.MySqlConnector
配置 Startup.cs 注入
public void ConfigureServices(IServiceCollection services) { IConfigurationSection Mysql = Configuration.GetSection("Mysql"); Fsql = new FreeSqlBuilder() .UseConnectionString(DataType.MySql, Mysql.Value) .UseAutoSyncStructure(true) .UseNameConvert(NameConvertType.PascalCaseToUnderscoreWithLower) .UseMonitorCommand(cmd => Trace.WriteLine(cmd.CommandText)) .Build(); services.AddSingleton<IFreeSql>(fsql); services.AddScoped<UnitOfWorkManager>(); services.AddFreeRepository(null, typeof(Startup).Assembly); //新增自己的服务,这里只有实现 services.AddScoped<TransBlogService>(); }
- appsettings.json
{ "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", }
UnitOfWorkManager 成员 | 说明 |
---|---|
IUnitOfWork Current | 返回当前的工作单元 |
void Binding(repository) | 将仓储的事务交给它管理 |
IUnitOfWork Begin(propagation, isolationLevel) | 创建工作单元 |
- TransBlogService.cs
private readonly IBaseRepository<Blog, int> _blogRepository; private readonly IBaseRepository<Tag, int> _tagRepository; private readonly UnitOfWorkManager _unitOfWorkManager; public TransBlogService(IBaseRepository<Blog, int> blogRepository, IBaseRepository<Tag, int> tagRepository,UnitOfWorkManager unitOfWorkManager) { _blogRepository = blogRepository ; _tagRepository = tagRepository ; _unitOfWorkManager = unitOfWorkManager; } public async Task CreateBlogUnitOfWorkAsync(Blog blog,List<Tag>tagList) { 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 unitOfWork.Rollback(); //记录日志、或继续throw;出来 } } } 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(); } } }
IUnitOfWork 成员 | 说明 |
---|---|
IFreeSql Orm | 该对象 Select/Delete/Insert/Update/InsertOrUpdate 与工作单元事务保持一致,可省略传递 WithTransaction |
DbTransaction GetOrBeginTransaction() | 开启事务,或者返回已开启的事务 |
void Commit() | 提交事务 |
void Rollback() | 回滚事务 |
DbContext.EntityChangeReport EntityChangeReport | 工作单元内的实体变化跟踪 |
完整的代码
- Blog.cs
- Tag.cs
- TransBlogService.cs
以上使用的是泛型仓储,那我们如果是重写一个仓储 如何保持和UnitOfWorkManager
同一个事务呢。
继承现有的DefaultRepository<,>
仓储,实现自定义的仓储BlogRepository.cs
,
public class BlogRepository : DefaultRepository<Blog, int>, IBlogRepository { public BlogRepository(UnitOfWorkManager uowm) : base(uowm?.Orm, uowm) { } public List<Blog> GetBlogs() { return Select.Page(1, 10).ToList(); } }
其中接口。IBlogRepository.cs
public interface IBlogRepository : IBaseRepository<Blog, int> { List<Blog> GetBlogs(); }
在 startup.cs注入此服务
services.AddScoped<IBlogRepository, BlogRepository>();
这篇关于ASP.NET Core下FreeSql的仓储事务的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#