using FreeSql; using FreeSql.Internal; using System; using System.Collections.Generic; using System.Data; using System.Text; namespace FreeSql { class DbContextScopedFreeSql : IFreeSql { public IFreeSql _originalFsql; Func _resolveDbContext; Func _resolveUnitOfWork; DbContextScopedFreeSql() { } public static DbContextScopedFreeSql Create(IFreeSql fsql, Func resolveDbContext, Func resolveUnitOfWork) { if (fsql == null) return null; var scopedfsql = fsql as DbContextScopedFreeSql; if (scopedfsql == null) return new DbContextScopedFreeSql { _originalFsql = fsql, _resolveDbContext = resolveDbContext, _resolveUnitOfWork = resolveUnitOfWork }; return Create(scopedfsql._originalFsql, resolveDbContext, resolveUnitOfWork); } public IAdo Ado => _originalFsql.Ado; public IAop Aop => _originalFsql.Aop; public ICodeFirst CodeFirst => _originalFsql.CodeFirst; public IDbFirst DbFirst => _originalFsql.DbFirst; public GlobalFilter GlobalFilter => _originalFsql.GlobalFilter; public void Dispose() { } public void Transaction(Action handler) => _originalFsql.Transaction(handler); public void Transaction(TimeSpan timeout, Action handler) => _originalFsql.Transaction(timeout, handler); public void Transaction(IsolationLevel isolationLevel, TimeSpan timeout, Action handler) => _originalFsql.Transaction(isolationLevel, timeout, handler); public ISelect Select() where T1 : class { var db = _resolveDbContext?.Invoke(); db?.FlushCommand(); var select = _originalFsql.Select().WithTransaction(_resolveUnitOfWork?.Invoke()?.GetOrBeginTransaction(false)); if (db?.Options.EnableGlobalFilter == false) select.DisableGlobalFilter(); return select; } public ISelect Select(object dywhere) where T1 : class => Select().WhereDynamic(dywhere); public IDelete Delete() where T1 : class { var db = _resolveDbContext?.Invoke(); db?.FlushCommand(); var delete = _originalFsql.Delete().WithTransaction(_resolveUnitOfWork?.Invoke()?.GetOrBeginTransaction()); if (db?.Options.EnableGlobalFilter == false) delete.DisableGlobalFilter(); return delete; } public IDelete Delete(object dywhere) where T1 : class => Delete().WhereDynamic(dywhere); public IUpdate Update() where T1 : class { var db = _resolveDbContext?.Invoke(); db?.FlushCommand(); var update = _originalFsql.Update().WithTransaction(_resolveUnitOfWork?.Invoke()?.GetOrBeginTransaction()); if (db?.Options.NoneParameter != null) update.NoneParameter(db.Options.NoneParameter.Value); if (db?.Options.EnableGlobalFilter == false) update.DisableGlobalFilter(); return update; } public IUpdate Update(object dywhere) where T1 : class => Update().WhereDynamic(dywhere); public IInsert Insert() where T1 : class { var db = _resolveDbContext?.Invoke(); db?.FlushCommand(); var insert = _originalFsql.Insert().WithTransaction(_resolveUnitOfWork?.Invoke()?.GetOrBeginTransaction()); if (db?.Options.NoneParameter != null) insert.NoneParameter(db.Options.NoneParameter.Value); return insert; } public IInsert Insert(T1 source) where T1 : class => Insert().AppendData(source); public IInsert Insert(T1[] source) where T1 : class => Insert().AppendData(source); public IInsert Insert(List source) where T1 : class => Insert().AppendData(source); public IInsert Insert(IEnumerable source) where T1 : class => Insert().AppendData(source); public IInsertOrUpdate InsertOrUpdate() where T1 : class { var db = _resolveDbContext?.Invoke(); db?.FlushCommand(); return _originalFsql.InsertOrUpdate().WithTransaction(_resolveUnitOfWork?.Invoke()?.GetOrBeginTransaction()); } } }