diff --git a/工作单元.md b/工作单元.md index 199fd63..4156bbc 100644 --- a/工作单元.md +++ b/工作单元.md @@ -33,6 +33,40 @@ using (var uow = fsql.CreateUnitOfWork()) 参考:[在 asp.net core 中使用 TransactionalAttribute + UnitOfWorkManager 实现多种事务传播](DI-UnitOfWorkManager) +## 外部事务 + +```csharp +// 场景:已经有一个开启的 Connection 和 Transaction +using (var conn = new Microsoft.Data.SqlClient.SqlConnection("...")) +{ + conn.Open(); + using (var tran = conn.BeginTransaction()) + { + // 1. 原生/Dapper 操作 + // command.Transaction = tran; + // command.ExecuteNonQuery(); + + // 2. 桥接给 FreeSql + // 使用扩展方法创建适配器,传入现有的 tran + using (var uow = fsql.CreateUnitOfWork(tran)) + { + // 在此 uow 下获取的仓储或 Orm,都会使用传入的 tran + var repo = uow.GetRepository(); + repo.Insert(new MyEntity { Name = "FreeSql Insert" }); + + // 或者直接使用 Orm + uow.Orm.Insert(new MyEntity { Name = "Direct Orm Insert" }).ExecuteAffrows(); + + // 这里的 Commit 只会触发 FreeSql 的事件,不会提交物理事务 + uow.Commit(); + } + + // 3. 真正的提交由最外层控制 + tran.Commit(); + } +} +``` + ## 接口定义 uow.GetOrBeginTransaction() 方法可获取事务对象。