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 { _resolveDbContext?.Invoke()?.FlushCommand(); return _originalFsql.Select().WithTransaction(_resolveUnitOfWork()?.GetOrBeginTransaction(false)); } public ISelect Select(object dywhere) where T1 : class => Select().WhereDynamic(dywhere); public IDelete Delete() where T1 : class { _resolveDbContext?.Invoke()?.FlushCommand(); return _originalFsql.Delete().WithTransaction(_resolveUnitOfWork()?.GetOrBeginTransaction()); } 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()?.GetOrBeginTransaction()); if (db?.Options.NoneParameter != null) update.NoneParameter(db.Options.NoneParameter.Value); 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()?.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); } }