using FreeSql; using FreeSql.DataAnnotations; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System.ComponentModel; using System.Threading.Tasks; namespace aspnetcore_transaction.Controllers { [ApiController] [Route("")] public class HomeController : ControllerBase { private readonly ILogger _logger; public HomeController(ILogger logger) { _logger = logger; } [HttpGet("1")] //[Transactional] virtual public object Get([FromServices] BaseRepository repoSong, [FromServices] BaseRepository repoDetail, [FromServices] SongRepository repoSong2, [FromServices] SongService serviceSong) { serviceSong.Test1(); return "111"; } [HttpGet("2")] //[Transactional] async virtual public Task GetAsync([FromServices] BaseRepository repoSong, [FromServices] BaseRepository repoDetail, [FromServices] SongRepository repoSong2, [FromServices] SongService serviceSong) { await serviceSong.Test2(); await serviceSong.Test3(); return "111"; } } public class SongService { BaseRepository _repoSong; BaseRepository _repoDetail; SongRepository _repoSong2; public SongService(BaseRepository repoSong, BaseRepository repoDetail, SongRepository repoSong2) { var tb = repoSong.Orm.CodeFirst.GetTableByEntity(typeof(Song)); _repoSong = repoSong; _repoDetail = repoDetail; _repoSong2 = repoSong2; } [Transactional(Propagation = Propagation.Nested)] //sqlite 不能嵌套事务,会锁库的 public virtual void Test1() { _repoSong.Insert(new Song()); _repoDetail.Insert(new Detail()); _repoSong2.Insert(new Song()); } [Transactional(Propagation = Propagation.Nested)] //sqlite 不能嵌套事务,会锁库的 async public virtual Task Test2() { await _repoSong.InsertAsync(new Song()); await _repoDetail.InsertAsync(new Detail()); await _repoSong2.InsertAsync(new Song()); } [Transactional(Propagation = Propagation.Nested)] //sqlite 不能嵌套事务,会锁库的 async public virtual Task Test3() { await _repoSong.InsertAsync(new Song()); await _repoDetail.InsertAsync(new Detail()); await _repoSong2.InsertAsync(new Song()); return "123"; } } public class SongRepository : DefaultRepository { public SongRepository(UnitOfWorkManager uowm) : base(uowm?.Orm, uowm) { } } [Description("123")] public class Song { /// /// 自增 /// [Column(IsIdentity = true)] [Description("自增id")] public int Id { get; set; } public string Title { get; set; } } public class Detail { [Column(IsIdentity = true)] public int Id { get; set; } public int SongId { get; set; } public string Title { get; set; } } }