From a79ee52b4f450293e467b2b4cdc7e10482f0dd39 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Tue, 13 Aug 2019 19:13:48 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20DbContext/Repository?= =?UTF-8?q?=20=E5=B1=80=E9=83=A8=E8=B0=83=E6=95=B4=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Entities/User.cs | 4 +- Examples/base_entity/Program.cs | 3 +- FreeSql.DbContext/DbContext/DbContext.cs | 66 ++++++++----- FreeSql.DbContext/DbContext/DbContextAsync.cs | 2 +- FreeSql.DbContext/DbContext/DbContextSync.cs | 2 +- FreeSql.DbContext/DbContext/FreeContext.cs | 2 +- FreeSql.DbContext/DbSet/DbSet.cs | 98 +++++++++---------- FreeSql.DbContext/DbSet/DbSetAsync.cs | 54 +++++----- FreeSql.DbContext/DbSet/DbSetSync.cs | 56 +++++------ .../Extenssions/DependencyInjection.cs | 31 +++--- .../ContextSet/RepositoryDbContext.cs | 29 +++--- .../Repository/ContextSet/RepositoryDbSet.cs | 31 +++--- .../ContextSet/RepositoryUnitOfWork.cs | 18 ++-- .../Repository/Repository/BaseRepository.cs | 12 +-- 14 files changed, 211 insertions(+), 197 deletions(-) diff --git a/Examples/base_entity/Entities/User.cs b/Examples/base_entity/Entities/User.cs index 7db6ab8c..687feb55 100644 --- a/Examples/base_entity/Entities/User.cs +++ b/Examples/base_entity/Entities/User.cs @@ -1,6 +1,6 @@ -using System; +using FreeSql; +using System; using System.Collections.Generic; -using System.Text; public class UserGroup : BaseEntity { diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 76297250..d6868178 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -1,4 +1,5 @@ -using System; +using FreeSql; +using System; using System.Threading.Tasks; namespace base_entity diff --git a/FreeSql.DbContext/DbContext/DbContext.cs b/FreeSql.DbContext/DbContext/DbContext.cs index e979d460..364326eb 100644 --- a/FreeSql.DbContext/DbContext/DbContext.cs +++ b/FreeSql.DbContext/DbContext/DbContext.cs @@ -9,41 +9,51 @@ namespace FreeSql { public abstract partial class DbContext : IDisposable { + internal IFreeSql _ormPriv; + public IFreeSql Orm => _ormPriv ?? throw new ArgumentNullException("请在 OnConfiguring 或 AddFreeDbContext 中配置 UseFreeSql"); - internal IFreeSql _orm; - public IFreeSql Orm => _orm ?? throw new ArgumentNullException("请在 OnConfiguring 或 AddFreeDbContext 中配置 UseFreeSql"); - - protected IUnitOfWork _uowPriv; - internal IUnitOfWork _uow => _isUseUnitOfWork ? (_uowPriv ?? (_uowPriv = new UnitOfWork(Orm))) : null; - internal bool _isUseUnitOfWork = true; //不使用工作单元事务 - - public IUnitOfWork UnitOfWork => _uow; - - DbContextOptions _options; - public DbContextOptions Options + #region Property UnitOfWork + internal bool _isUseUnitOfWork = true; //是否使用工作单元事务 + IUnitOfWork _uowPriv; + public IUnitOfWork UnitOfWork { + set => _uowPriv = value; get { - if (_options != null) return _options; - if (FreeSqlDbContextExtenssions._dicSetDbContextOptions.TryGetValue(Orm, out _options)) return _options; - _options = new DbContextOptions(); - return _options; + if (_uowPriv != null) return _uowPriv; + if (_isUseUnitOfWork == false) return null; + return _uowPriv = new UnitOfWork(Orm); } - set => _options = value; } - + #endregion + + #region Property Options + internal DbContextOptions _optionsPriv; + public DbContextOptions Options + { + set => _optionsPriv = value; + get + { + if (_optionsPriv != null) return _optionsPriv; + if (FreeSqlDbContextExtenssions._dicSetDbContextOptions.TryGetValue(Orm, out _optionsPriv)) return _optionsPriv; + _optionsPriv = new DbContextOptions(); + return _optionsPriv; + } + } + #endregion + protected DbContext() { - var builder = new DbContextOptionsBuilder(); OnConfiguring(builder); - _orm = builder._fsql; - _options = builder._options; + _ormPriv = builder._fsql; + _optionsPriv = builder._options; - if (_orm != null) InitPropSets(); + if (_ormPriv != null) InitPropSets(); } protected virtual void OnConfiguring(DbContextOptionsBuilder builder) { } + #region Set static ConcurrentDictionary _dicGetDbSetProps = new ConcurrentDictionary(); internal void InitPropSets() { @@ -61,16 +71,19 @@ namespace FreeSql } } + protected List _listSet = new List(); protected Dictionary _dicSet = new Dictionary(); public DbSet Set() where TEntity : class => this.Set(typeof(TEntity)) as DbSet; public virtual IDbSet Set(Type entityType) { if (_dicSet.ContainsKey(entityType)) return _dicSet[entityType]; var sd = Activator.CreateInstance(typeof(DbContextDbSet<>).MakeGenericType(entityType), this) as IDbSet; + _listSet.Add(sd); if (entityType != typeof(object)) _dicSet.Add(entityType, sd); return sd; } protected Dictionary AllSets { get; } = new Dictionary(); + #endregion #region DbSet 快速代理 /// @@ -118,6 +131,7 @@ namespace FreeSql public void AttachRange(IEnumerable data) where TEntity : class => this.Set().AttachRange(data); #endregion + #region Queue Action internal class ExecCommandInfo { public ExecCommandInfoType actionType { get; set; } @@ -131,31 +145,33 @@ namespace FreeSql internal void EnqueueAction(ExecCommandInfoType actionType, IDbSet dbSet, Type stateType, object state) => _actions.Enqueue(new ExecCommandInfo { actionType = actionType, dbSet = dbSet, stateType = stateType, state = state }); + #endregion ~DbContext() => this.Dispose(); bool _isdisposed = false; public void Dispose() { if (_isdisposed) return; + _isdisposed = true; try { _actions.Clear(); - foreach (var set in _dicSet) + foreach (var set in _listSet) try { - set.Value.Dispose(); + set.Dispose(); } catch { } + _listSet.Clear(); _dicSet.Clear(); AllSets.Clear(); - _uow?.Rollback(); + UnitOfWork?.Rollback(); } finally { - _isdisposed = true; GC.SuppressFinalize(this); } } diff --git a/FreeSql.DbContext/DbContext/DbContextAsync.cs b/FreeSql.DbContext/DbContext/DbContextAsync.cs index 50deeacd..698a1200 100644 --- a/FreeSql.DbContext/DbContext/DbContextAsync.cs +++ b/FreeSql.DbContext/DbContext/DbContextAsync.cs @@ -13,7 +13,7 @@ namespace FreeSql async public virtual Task SaveChangesAsync() { await ExecCommandAsync(); - _uow?.Commit(); + UnitOfWork?.Commit(); var ret = _affrows; _affrows = 0; return ret; diff --git a/FreeSql.DbContext/DbContext/DbContextSync.cs b/FreeSql.DbContext/DbContext/DbContextSync.cs index 65a00f16..4c8f2c3b 100644 --- a/FreeSql.DbContext/DbContext/DbContextSync.cs +++ b/FreeSql.DbContext/DbContext/DbContextSync.cs @@ -12,7 +12,7 @@ namespace FreeSql public virtual int SaveChanges() { ExecCommand(); - _uow?.Commit(); + UnitOfWork?.Commit(); var ret = _affrows; _affrows = 0; return ret; diff --git a/FreeSql.DbContext/DbContext/FreeContext.cs b/FreeSql.DbContext/DbContext/FreeContext.cs index 38e23bc0..62fbe1c7 100644 --- a/FreeSql.DbContext/DbContext/FreeContext.cs +++ b/FreeSql.DbContext/DbContext/FreeContext.cs @@ -7,7 +7,7 @@ namespace FreeSql public FreeContext(IFreeSql orm) { - _orm = orm; + _ormPriv = orm; } } } diff --git a/FreeSql.DbContext/DbSet/DbSet.cs b/FreeSql.DbContext/DbSet/DbSet.cs index 59abb863..9a5d208e 100644 --- a/FreeSql.DbContext/DbSet/DbSet.cs +++ b/FreeSql.DbContext/DbSet/DbSet.cs @@ -11,14 +11,12 @@ using System.Reflection; namespace FreeSql { - internal class DbContextDbSet : DbSet where TEntity : class + class DbContextDbSet : DbSet where TEntity : class { - public DbContextDbSet(DbContext ctx) { - _ctx = ctx; - _uow = ctx._uow; - _fsql = ctx.Orm; + _db = ctx; + _uow = ctx.UnitOfWork; } } @@ -28,25 +26,21 @@ namespace FreeSql } public abstract partial class DbSet : IDbSet where TEntity : class { - - internal DbContext _ctx; - internal IUnitOfWork _uow; - internal IFreeSql _fsql; + internal DbContext _db { get; set; } + internal IUnitOfWork _uow { get; set; } protected virtual ISelect OrmSelect(object dywhere) { DbContextExecCommand(); //查询前先提交,否则会出脏读 - return _fsql.Select().AsType(_entityType).WithTransaction(_uow?.GetOrBeginTransaction(false)).TrackToList(TrackToList).WhereDynamic(dywhere); + return _db.Orm.Select().AsType(_entityType).WithTransaction(_uow?.GetOrBeginTransaction(false)).TrackToList(TrackToList).WhereDynamic(dywhere); } - ~DbSet() - { - this.Dispose(); - } + ~DbSet() => this.Dispose(); bool _isdisposed = false; public void Dispose() { if (_isdisposed) return; + _isdisposed = true; try { this._dicUpdateTimes.Clear(); @@ -54,26 +48,22 @@ namespace FreeSql } finally { - _isdisposed = true; GC.SuppressFinalize(this); } } - protected virtual IInsert OrmInsert() => _fsql.Insert().AsType(_entityType).WithTransaction(_uow?.GetOrBeginTransaction()); - protected virtual IInsert OrmInsert(TEntity data) => _fsql.Insert().AsType(_entityType).WithTransaction(_uow?.GetOrBeginTransaction()).AppendData(data); - protected virtual IInsert OrmInsert(IEnumerable data) => _fsql.Insert().AsType(_entityType).WithTransaction(_uow?.GetOrBeginTransaction()).AppendData(data); + protected virtual IInsert OrmInsert() => _db.Orm.Insert().AsType(_entityType).WithTransaction(_uow?.GetOrBeginTransaction()); + protected virtual IInsert OrmInsert(TEntity data) => _db.Orm.Insert().AsType(_entityType).WithTransaction(_uow?.GetOrBeginTransaction()).AppendData(data); + protected virtual IInsert OrmInsert(IEnumerable data) => _db.Orm.Insert().AsType(_entityType).WithTransaction(_uow?.GetOrBeginTransaction()).AppendData(data); - protected virtual IUpdate OrmUpdate(IEnumerable entitys) => _fsql.Update().AsType(_entityType).SetSource(entitys).WithTransaction(_uow?.GetOrBeginTransaction()); - protected virtual IDelete OrmDelete(object dywhere) => _fsql.Delete().AsType(_entityType).WithTransaction(_uow?.GetOrBeginTransaction()).WhereDynamic(dywhere); + protected virtual IUpdate OrmUpdate(IEnumerable entitys) => _db.Orm.Update().AsType(_entityType).SetSource(entitys).WithTransaction(_uow?.GetOrBeginTransaction()); + protected virtual IDelete OrmDelete(object dywhere) => _db.Orm.Delete().AsType(_entityType).WithTransaction(_uow?.GetOrBeginTransaction()).WhereDynamic(dywhere); - internal void EnqueueToDbContext(DbContext.ExecCommandInfoType actionType, EntityState state) - { - _ctx.EnqueueAction(actionType, this, typeof(EntityState), state); - } - internal void IncrAffrows(int affrows) - { - _ctx._affrows += affrows; - } + internal void EnqueueToDbContext(DbContext.ExecCommandInfoType actionType, EntityState state) => + _db.EnqueueAction(actionType, this, typeof(EntityState), state); + + internal void IncrAffrows(int affrows) => + _db._affrows += affrows; internal void TrackToList(object list) { @@ -89,7 +79,7 @@ namespace FreeSql var itemType = item.GetType(); if (itemType == typeof(object)) return; if (itemType.FullName.StartsWith("Submission#")) itemType = itemType.BaseType; - var dbset = _ctx.Set(itemType); + var dbset = _db.Set(itemType); dbset?.GetType().GetMethod("TrackToList", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(dbset, new object[] { list }); return; } @@ -98,11 +88,11 @@ namespace FreeSql foreach (var item in ls) { - var key = _fsql.GetEntityKeyString(_entityType, item, false); + var key = _db.Orm.GetEntityKeyString(_entityType, item, false); if (key == null) continue; _states.AddOrUpdate(key, k => CreateEntityState(item), (k, ov) => { - _fsql.MapEntityValue(_entityType, item, ov.Value); + _db.Orm.MapEntityValue(_entityType, item, ov.Value); ov.Time = DateTime.Now; return ov; }); @@ -116,7 +106,7 @@ namespace FreeSql protected ConcurrentDictionary _states = new ConcurrentDictionary(); internal ConcurrentDictionary _statesInternal => _states; TableInfo _tablePriv; - protected TableInfo _table => _tablePriv ?? (_tablePriv = _fsql.CodeFirst.GetTableByEntity(_entityType)); + protected TableInfo _table => _tablePriv ?? (_tablePriv = _db.Orm.CodeFirst.GetTableByEntity(_entityType)); ColumnInfo[] _tableIdentitysPriv; protected ColumnInfo[] _tableIdentitys => _tableIdentitysPriv ?? (_tableIdentitysPriv = _table.Primarys.Where(a => a.Attribute.IsIdentity).ToArray()); protected Type _entityType = typeof(TEntity); @@ -131,7 +121,7 @@ namespace FreeSql { if (entityType == typeof(object)) throw new Exception("ISelect.AsType 参数不支持指定为 object"); if (entityType == _entityType) return; - var newtb = _fsql.CodeFirst.GetTableByEntity(entityType); + var newtb = _db.Orm.CodeFirst.GetTableByEntity(entityType); _entityType = entityType; _tablePriv = newtb ?? throw new Exception("DbSet.AsType 参数错误,请传入正确的实体类型"); _tableIdentitysPriv = null; @@ -158,15 +148,15 @@ namespace FreeSql public void AttachRange(IEnumerable data) { if (data == null || data.Any() == false) return; - if (_table.Primarys.Any() == false) throw new Exception($"不可附加,实体没有主键:{_fsql.GetEntityString(_entityType, data.First())}"); + if (_table.Primarys.Any() == false) throw new Exception($"不可附加,实体没有主键:{_db.Orm.GetEntityString(_entityType, data.First())}"); foreach (var item in data) { - var key = _fsql.GetEntityKeyString(_entityType, item, false); - if (string.IsNullOrEmpty(key)) throw new Exception($"不可附加,未设置主键的值:{_fsql.GetEntityString(_entityType, item)}"); + var key = _db.Orm.GetEntityKeyString(_entityType, item, false); + if (string.IsNullOrEmpty(key)) throw new Exception($"不可附加,未设置主键的值:{_db.Orm.GetEntityString(_entityType, item)}"); _states.AddOrUpdate(key, k => CreateEntityState(item), (k, ov) => { - _fsql.MapEntityValue(_entityType, item, ov.Value); + _db.Orm.MapEntityValue(_entityType, item, ov.Value); ov.Time = DateTime.Now; return ov; }); @@ -184,15 +174,15 @@ namespace FreeSql EntityState CreateEntityState(TEntity data) { if (data == null) throw new ArgumentNullException(nameof(data)); - var key = _fsql.GetEntityKeyString(_entityType, data, false); + var key = _db.Orm.GetEntityKeyString(_entityType, data, false); var state = new EntityState((TEntity)Activator.CreateInstance(_entityType), key); - _fsql.MapEntityValue(_entityType, data, state.Value); + _db.Orm.MapEntityValue(_entityType, data, state.Value); return state; } bool? ExistsInStates(TEntity data) { if (data == null) throw new ArgumentNullException(nameof(data)); - var key = _fsql.GetEntityKeyString(_entityType, data, false); + var key = _db.Orm.GetEntityKeyString(_entityType, data, false); if (string.IsNullOrEmpty(key)) return null; return _states.ContainsKey(key); } @@ -217,13 +207,13 @@ namespace FreeSql } if (_table.Primarys.Any() == false) { - if (isThrow) throw new Exception($"不可添加,实体没有主键:{_fsql.GetEntityString(_entityType, data)}"); + if (isThrow) throw new Exception($"不可添加,实体没有主键:{_db.Orm.GetEntityString(_entityType, data)}"); return false; } - var key = _fsql.GetEntityKeyString(_entityType, data, true); + var key = _db.Orm.GetEntityKeyString(_entityType, data, true); if (string.IsNullOrEmpty(key)) { - switch (_fsql.Ado.DataType) + switch (_db.Orm.Ado.DataType) { case DataType.SqlServer: case DataType.PostgreSQL: @@ -235,7 +225,7 @@ namespace FreeSql { return true; } - if (isThrow) throw new Exception($"不可添加,未设置主键的值:{_fsql.GetEntityString(_entityType, data)}"); + if (isThrow) throw new Exception($"不可添加,未设置主键的值:{_db.Orm.GetEntityString(_entityType, data)}"); return false; } } @@ -243,13 +233,13 @@ namespace FreeSql { if (_states.ContainsKey(key)) { - if (isThrow) throw new Exception($"不可添加,已存在于状态管理:{_fsql.GetEntityString(_entityType, data)}"); + if (isThrow) throw new Exception($"不可添加,已存在于状态管理:{_db.Orm.GetEntityString(_entityType, data)}"); return false; } - var idval = _fsql.GetEntityIdentityValueWithPrimary(_entityType, data); + var idval = _db.Orm.GetEntityIdentityValueWithPrimary(_entityType, data); if (idval > 0) { - if (isThrow) throw new Exception($"不可添加,自增属性有值:{_fsql.GetEntityString(_entityType, data)}"); + if (isThrow) throw new Exception($"不可添加,自增属性有值:{_db.Orm.GetEntityString(_entityType, data)}"); return false; } } @@ -276,18 +266,18 @@ namespace FreeSql } if (_table.Primarys.Any() == false) { - if (isThrow) throw new Exception($"不可更新,实体没有主键:{_fsql.GetEntityString(_entityType, data)}"); + if (isThrow) throw new Exception($"不可更新,实体没有主键:{_db.Orm.GetEntityString(_entityType, data)}"); return false; } - var key = _fsql.GetEntityKeyString(_entityType, data, false); + var key = _db.Orm.GetEntityKeyString(_entityType, data, false); if (string.IsNullOrEmpty(key)) { - if (isThrow) throw new Exception($"不可更新,未设置主键的值:{_fsql.GetEntityString(_entityType, data)}"); + if (isThrow) throw new Exception($"不可更新,未设置主键的值:{_db.Orm.GetEntityString(_entityType, data)}"); return false; } if (_states.TryGetValue(key, out var tryval) == false) { - if (isThrow) throw new Exception($"不可更新,数据未被跟踪,应该先查询 或者 Attach:{_fsql.GetEntityString(_entityType, data)}"); + if (isThrow) throw new Exception($"不可更新,数据未被跟踪,应该先查询 或者 Attach:{_db.Orm.GetEntityString(_entityType, data)}"); return false; } return true; @@ -313,13 +303,13 @@ namespace FreeSql } if (_table.Primarys.Any() == false) { - if (isThrow) throw new Exception($"不可删除,实体没有主键:{_fsql.GetEntityString(_entityType, data)}"); + if (isThrow) throw new Exception($"不可删除,实体没有主键:{_db.Orm.GetEntityString(_entityType, data)}"); return false; } - var key = _fsql.GetEntityKeyString(_entityType, data, false); + var key = _db.Orm.GetEntityKeyString(_entityType, data, false); if (string.IsNullOrEmpty(key)) { - if (isThrow) throw new Exception($"不可删除,未设置主键的值:{_fsql.GetEntityString(_entityType, data)}"); + if (isThrow) throw new Exception($"不可删除,未设置主键的值:{_db.Orm.GetEntityString(_entityType, data)}"); return false; } //if (_states.TryGetValue(key, out var tryval) == false) { diff --git a/FreeSql.DbContext/DbSet/DbSetAsync.cs b/FreeSql.DbContext/DbSet/DbSetAsync.cs index 309046c8..0bad6548 100644 --- a/FreeSql.DbContext/DbSet/DbSetAsync.cs +++ b/FreeSql.DbContext/DbSet/DbSetAsync.cs @@ -14,7 +14,7 @@ namespace FreeSql Task DbContextExecCommandAsync() { _dicUpdateTimes.Clear(); - return _ctx.ExecCommandAsync(); + return _db.ExecCommandAsync(); } async Task DbContextBetchAddAsync(EntityState[] adds) @@ -31,7 +31,7 @@ namespace FreeSql if (_tableIdentitys.Length > 0) { //有自增,马上执行 - switch (_fsql.Ado.DataType) + switch (_db.Orm.Ado.DataType) { case DataType.SqlServer: case DataType.PostgreSQL: @@ -40,9 +40,9 @@ namespace FreeSql await DbContextExecCommandAsync(); var idtval = await this.OrmInsert(data).ExecuteIdentityAsync(); IncrAffrows(1); - _fsql.SetEntityIdentityValueWithPrimary(_entityType, data, idtval); + _db.Orm.SetEntityIdentityValueWithPrimary(_entityType, data, idtval); Attach(data); - if (_ctx.Options.EnableAddOrUpdateNavigateList) + if (_db.Options.EnableAddOrUpdateNavigateList) await AddOrUpdateNavigateListAsync(data); } else @@ -50,9 +50,9 @@ namespace FreeSql await DbContextExecCommandAsync(); var newval = (await this.OrmInsert(data).ExecuteInsertedAsync()).First(); IncrAffrows(1); - _fsql.MapEntityValue(_entityType, newval, data); + _db.Orm.MapEntityValue(_entityType, newval, data); Attach(newval); - if (_ctx.Options.EnableAddOrUpdateNavigateList) + if (_db.Options.EnableAddOrUpdateNavigateList) await AddOrUpdateNavigateListAsync(data); } return; @@ -64,9 +64,9 @@ namespace FreeSql await DbContextExecCommandAsync(); var idtval = await this.OrmInsert(data).ExecuteIdentityAsync(); IncrAffrows(1); - _fsql.SetEntityIdentityValueWithPrimary(_entityType, data, idtval); + _db.Orm.SetEntityIdentityValueWithPrimary(_entityType, data, idtval); Attach(data); - if (_ctx.Options.EnableAddOrUpdateNavigateList) + if (_db.Options.EnableAddOrUpdateNavigateList) await AddOrUpdateNavigateListAsync(data); } return; @@ -74,7 +74,7 @@ namespace FreeSql } EnqueueToDbContext(DbContext.ExecCommandInfoType.Insert, CreateEntityState(data)); Attach(data); - if (_ctx.Options.EnableAddOrUpdateNavigateList) + if (_db.Options.EnableAddOrUpdateNavigateList) await AddOrUpdateNavigateListAsync(data); } public Task AddAsync(TEntity data) => AddPrivAsync(data, true); @@ -89,19 +89,19 @@ namespace FreeSql if (_tableIdentitys.Length > 0) { //有自增,马上执行 - switch (_fsql.Ado.DataType) + switch (_db.Orm.Ado.DataType) { case DataType.SqlServer: case DataType.PostgreSQL: await DbContextExecCommandAsync(); var rets = await this.OrmInsert(data).ExecuteInsertedAsync(); - if (rets.Count != data.Count()) throw new Exception($"特别错误:批量添加失败,{_fsql.Ado.DataType} 的返回数据,与添加的数目不匹配"); + if (rets.Count != data.Count()) throw new Exception($"特别错误:批量添加失败,{_db.Orm.Ado.DataType} 的返回数据,与添加的数目不匹配"); var idx = 0; foreach (var s in data) - _fsql.MapEntityValue(_entityType, rets[idx++], s); + _db.Orm.MapEntityValue(_entityType, rets[idx++], s); IncrAffrows(rets.Count); AttachRange(rets); - if (_ctx.Options.EnableAddOrUpdateNavigateList) + if (_db.Options.EnableAddOrUpdateNavigateList) foreach (var item in data) await AddOrUpdateNavigateListAsync(item); return; @@ -119,7 +119,7 @@ namespace FreeSql foreach (var item in data) EnqueueToDbContext(DbContext.ExecCommandInfoType.Insert, CreateEntityState(item)); AttachRange(data); - if (_ctx.Options.EnableAddOrUpdateNavigateList) + if (_db.Options.EnableAddOrUpdateNavigateList) foreach (var item in data) await AddOrUpdateNavigateListAsync(item); } @@ -161,7 +161,7 @@ namespace FreeSql { if (dbset == null) { - dbset = _ctx.Set(tref.RefEntityType); + dbset = _db.Set(tref.RefEntityType); dbsetAddOrUpdate = dbset.GetType().GetMethod("AddOrUpdateAsync", new Type[] { tref.RefEntityType }); } for (var colidx = 0; colidx < tref.Columns.Count; colidx++) @@ -189,10 +189,10 @@ namespace FreeSql if (_states.TryGetValue(uplst1.Key, out var lstval1) == false) return -999; var lstval2 = default(EntityState); - if (uplst2 != null && _states.TryGetValue(uplst2.Key, out lstval2) == false) throw new Exception($"特别错误:更新失败,数据未被跟踪:{_fsql.GetEntityString(_entityType, uplst2.Value)}"); + if (uplst2 != null && _states.TryGetValue(uplst2.Key, out lstval2) == false) throw new Exception($"特别错误:更新失败,数据未被跟踪:{_db.Orm.GetEntityString(_entityType, uplst2.Value)}"); - var cuig1 = _fsql.CompareEntityValueReturnColumns(_entityType, uplst1.Value, lstval1.Value, true); - var cuig2 = uplst2 != null ? _fsql.CompareEntityValueReturnColumns(_entityType, uplst2.Value, lstval2.Value, true) : null; + var cuig1 = _db.Orm.CompareEntityValueReturnColumns(_entityType, uplst1.Value, lstval1.Value, true); + var cuig2 = uplst2 != null ? _db.Orm.CompareEntityValueReturnColumns(_entityType, uplst2.Value, lstval2.Value, true) : null; List data = null; string[] cuig = null; @@ -224,9 +224,9 @@ namespace FreeSql foreach (var newval in data) { if (_states.TryGetValue(newval.Key, out var tryold)) - _fsql.MapEntityValue(_entityType, newval.Value, tryold.Value); + _db.Orm.MapEntityValue(_entityType, newval.Value, tryold.Value); if (newval.OldValue != null) - _fsql.MapEntityValue(_entityType, newval.Value, newval.OldValue); + _db.Orm.MapEntityValue(_entityType, newval.Value, newval.OldValue); } return affrows; } @@ -237,11 +237,11 @@ namespace FreeSql async public Task UpdateAsync(TEntity data) { var exists = ExistsInStates(data); - if (exists == null) throw new Exception($"不可更新,未设置主键的值:{_fsql.GetEntityString(_entityType, data)}"); + if (exists == null) throw new Exception($"不可更新,未设置主键的值:{_db.Orm.GetEntityString(_entityType, data)}"); if (exists == false) { var olddata = await OrmSelect(data).FirstAsync(); - if (olddata == null) throw new Exception($"不可更新,数据库不存在该记录:{_fsql.GetEntityString(_entityType, data)}"); + if (olddata == null) throw new Exception($"不可更新,数据库不存在该记录:{_db.Orm.GetEntityString(_entityType, data)}"); } await UpdateRangePrivAsync(new[] { data }, true); @@ -260,7 +260,7 @@ namespace FreeSql state.OldValue = item; EnqueueToDbContext(DbContext.ExecCommandInfoType.Update, state); } - if (_ctx.Options.EnableAddOrUpdateNavigateList) + if (_db.Options.EnableAddOrUpdateNavigateList) foreach (var item in data) await AddOrUpdateNavigateListAsync(item); } @@ -279,7 +279,7 @@ namespace FreeSql async public Task AddOrUpdateAsync(TEntity data) { if (data == null) throw new ArgumentNullException(nameof(data)); - if (_table.Primarys.Any() == false) throw new Exception($"不可添加,实体没有主键:{_fsql.GetEntityString(_entityType, data)}"); + if (_table.Primarys.Any() == false) throw new Exception($"不可添加,实体没有主键:{_db.Orm.GetEntityString(_entityType, data)}"); var flagExists = ExistsInStates(data); if (flagExists == false) @@ -291,15 +291,15 @@ namespace FreeSql if (flagExists == true && CanUpdate(data, false)) { await DbContextExecCommandAsync(); - var affrows = _ctx._affrows; + var affrows = _db._affrows; await UpdateRangePrivAsync(new[] { data }, false); await DbContextExecCommandAsync(); - affrows = _ctx._affrows - affrows; + affrows = _db._affrows - affrows; if (affrows > 0) return; } if (CanAdd(data, false)) { - _fsql.ClearEntityPrimaryValueWithIdentity(_entityType, data); + _db.Orm.ClearEntityPrimaryValueWithIdentity(_entityType, data); await AddPrivAsync(data, false); } } diff --git a/FreeSql.DbContext/DbSet/DbSetSync.cs b/FreeSql.DbContext/DbSet/DbSetSync.cs index b056583b..ff404f54 100644 --- a/FreeSql.DbContext/DbSet/DbSetSync.cs +++ b/FreeSql.DbContext/DbSet/DbSetSync.cs @@ -14,7 +14,7 @@ namespace FreeSql void DbContextExecCommand() { _dicUpdateTimes.Clear(); - _ctx.ExecCommand(); + _db.ExecCommand(); } int DbContextBetchAdd(EntityState[] adds) @@ -31,7 +31,7 @@ namespace FreeSql if (_tableIdentitys.Length > 0) { //有自增,马上执行 - switch (_fsql.Ado.DataType) + switch (_db.Orm.Ado.DataType) { case DataType.SqlServer: case DataType.PostgreSQL: @@ -40,9 +40,9 @@ namespace FreeSql DbContextExecCommand(); var idtval = this.OrmInsert(data).ExecuteIdentity(); IncrAffrows(1); - _fsql.SetEntityIdentityValueWithPrimary(_entityType, data, idtval); + _db.Orm.SetEntityIdentityValueWithPrimary(_entityType, data, idtval); Attach(data); - if (_ctx.Options.EnableAddOrUpdateNavigateList) + if (_db.Options.EnableAddOrUpdateNavigateList) AddOrUpdateNavigateList(data); } else @@ -50,9 +50,9 @@ namespace FreeSql DbContextExecCommand(); var newval = this.OrmInsert(data).ExecuteInserted().First(); IncrAffrows(1); - _fsql.MapEntityValue(_entityType, newval, data); + _db.Orm.MapEntityValue(_entityType, newval, data); Attach(newval); - if (_ctx.Options.EnableAddOrUpdateNavigateList) + if (_db.Options.EnableAddOrUpdateNavigateList) AddOrUpdateNavigateList(data); } return; @@ -64,9 +64,9 @@ namespace FreeSql DbContextExecCommand(); var idtval = this.OrmInsert(data).ExecuteIdentity(); IncrAffrows(1); - _fsql.SetEntityIdentityValueWithPrimary(_entityType, data, idtval); + _db.Orm.SetEntityIdentityValueWithPrimary(_entityType, data, idtval); Attach(data); - if (_ctx.Options.EnableAddOrUpdateNavigateList) + if (_db.Options.EnableAddOrUpdateNavigateList) AddOrUpdateNavigateList(data); } return; @@ -74,7 +74,7 @@ namespace FreeSql } EnqueueToDbContext(DbContext.ExecCommandInfoType.Insert, CreateEntityState(data)); Attach(data); - if (_ctx.Options.EnableAddOrUpdateNavigateList) + if (_db.Options.EnableAddOrUpdateNavigateList) AddOrUpdateNavigateList(data); } /// @@ -93,19 +93,19 @@ namespace FreeSql if (_tableIdentitys.Length > 0) { //有自增,马上执行 - switch (_fsql.Ado.DataType) + switch (_db.Orm.Ado.DataType) { case DataType.SqlServer: case DataType.PostgreSQL: DbContextExecCommand(); var rets = this.OrmInsert(data).ExecuteInserted(); - if (rets.Count != data.Count()) throw new Exception($"特别错误:批量添加失败,{_fsql.Ado.DataType} 的返回数据,与添加的数目不匹配"); + if (rets.Count != data.Count()) throw new Exception($"特别错误:批量添加失败,{_db.Orm.Ado.DataType} 的返回数据,与添加的数目不匹配"); var idx = 0; foreach (var s in data) - _fsql.MapEntityValue(_entityType, rets[idx++], s); + _db.Orm.MapEntityValue(_entityType, rets[idx++], s); IncrAffrows(rets.Count); AttachRange(rets); - if (_ctx.Options.EnableAddOrUpdateNavigateList) + if (_db.Options.EnableAddOrUpdateNavigateList) foreach (var item in data) AddOrUpdateNavigateList(item); return; @@ -123,7 +123,7 @@ namespace FreeSql foreach (var item in data) EnqueueToDbContext(DbContext.ExecCommandInfoType.Insert, CreateEntityState(item)); AttachRange(data); - if (_ctx.Options.EnableAddOrUpdateNavigateList) + if (_db.Options.EnableAddOrUpdateNavigateList) foreach (var item in data) AddOrUpdateNavigateList(item); } @@ -175,7 +175,7 @@ namespace FreeSql { if (dbset == null) { - dbset = _ctx.Set(tref.RefEntityType); + dbset = _db.Set(tref.RefEntityType); dbsetAddOrUpdate = dbset.GetType().GetMethod("AddOrUpdate", new Type[] { tref.RefEntityType }); } for (var colidx = 0; colidx < tref.Columns.Count; colidx++) @@ -202,10 +202,10 @@ namespace FreeSql if (_states.TryGetValue(uplst1.Key, out var lstval1) == false) return -999; var lstval2 = default(EntityState); - if (uplst2 != null && _states.TryGetValue(uplst2.Key, out lstval2) == false) throw new Exception($"特别错误:更新失败,数据未被跟踪:{_fsql.GetEntityString(_entityType, uplst2.Value)}"); + if (uplst2 != null && _states.TryGetValue(uplst2.Key, out lstval2) == false) throw new Exception($"特别错误:更新失败,数据未被跟踪:{_db.Orm.GetEntityString(_entityType, uplst2.Value)}"); - var cuig1 = _fsql.CompareEntityValueReturnColumns(_entityType, uplst1.Value, lstval1.Value, true); - var cuig2 = uplst2 != null ? _fsql.CompareEntityValueReturnColumns(_entityType, uplst2.Value, lstval2.Value, true) : null; + var cuig1 = _db.Orm.CompareEntityValueReturnColumns(_entityType, uplst1.Value, lstval1.Value, true); + var cuig2 = uplst2 != null ? _db.Orm.CompareEntityValueReturnColumns(_entityType, uplst2.Value, lstval2.Value, true) : null; List data = null; string[] cuig = null; @@ -237,9 +237,9 @@ namespace FreeSql foreach (var newval in data) { if (_states.TryGetValue(newval.Key, out var tryold)) - _fsql.MapEntityValue(_entityType, newval.Value, tryold.Value); + _db.Orm.MapEntityValue(_entityType, newval.Value, tryold.Value); if (newval.OldValue != null) - _fsql.MapEntityValue(_entityType, newval.Value, newval.OldValue); + _db.Orm.MapEntityValue(_entityType, newval.Value, newval.OldValue); } return affrows; } @@ -256,11 +256,11 @@ namespace FreeSql public void Update(TEntity data) { var exists = ExistsInStates(data); - if (exists == null) throw new Exception($"不可更新,未设置主键的值:{_fsql.GetEntityString(_entityType, data)}"); + if (exists == null) throw new Exception($"不可更新,未设置主键的值:{_db.Orm.GetEntityString(_entityType, data)}"); if (exists == false) { var olddata = OrmSelect(data).First(); - if (olddata == null) throw new Exception($"不可更新,数据库不存在该记录:{_fsql.GetEntityString(_entityType, data)}"); + if (olddata == null) throw new Exception($"不可更新,数据库不存在该记录:{_db.Orm.GetEntityString(_entityType, data)}"); } UpdateRangePriv(new[] { data }, true); @@ -279,7 +279,7 @@ namespace FreeSql state.OldValue = item; EnqueueToDbContext(DbContext.ExecCommandInfoType.Update, state); } - if (_ctx.Options.EnableAddOrUpdateNavigateList) + if (_db.Options.EnableAddOrUpdateNavigateList) foreach (var item in data) AddOrUpdateNavigateList(item); } @@ -305,7 +305,7 @@ namespace FreeSql { var state = CreateEntityState(item); _states.TryRemove(state.Key, out var trystate); - _fsql.ClearEntityPrimaryValueWithIdentityAndGuid(_entityType, item); + _db.Orm.ClearEntityPrimaryValueWithIdentityAndGuid(_entityType, item); EnqueueToDbContext(DbContext.ExecCommandInfoType.Delete, state); } @@ -320,7 +320,7 @@ namespace FreeSql public void AddOrUpdate(TEntity data) { if (data == null) throw new ArgumentNullException(nameof(data)); - if (_table.Primarys.Any() == false) throw new Exception($"不可添加,实体没有主键:{_fsql.GetEntityString(_entityType, data)}"); + if (_table.Primarys.Any() == false) throw new Exception($"不可添加,实体没有主键:{_db.Orm.GetEntityString(_entityType, data)}"); var flagExists = ExistsInStates(data); if (flagExists == false) @@ -332,15 +332,15 @@ namespace FreeSql if (flagExists == true && CanUpdate(data, false)) { DbContextExecCommand(); - var affrows = _ctx._affrows; + var affrows = _db._affrows; UpdateRangePriv(new[] { data }, false); DbContextExecCommand(); - affrows = _ctx._affrows - affrows; + affrows = _db._affrows - affrows; if (affrows > 0) return; } if (CanAdd(data, false)) { - _fsql.ClearEntityPrimaryValueWithIdentity(_entityType, data); + _db.Orm.ClearEntityPrimaryValueWithIdentity(_entityType, data); AddPriv(data, false); } } diff --git a/FreeSql.DbContext/Extenssions/DependencyInjection.cs b/FreeSql.DbContext/Extenssions/DependencyInjection.cs index bf92a08e..54ba7447 100644 --- a/FreeSql.DbContext/Extenssions/DependencyInjection.cs +++ b/FreeSql.DbContext/Extenssions/DependencyInjection.cs @@ -1,35 +1,44 @@ #if ns20 - using Microsoft.Extensions.DependencyInjection; using System; +using System.Linq; +using System.Reflection; namespace FreeSql { public static class DbContextDependencyInjection { - - public static IServiceCollection AddFreeDbContext(this IServiceCollection services, Action options) where TDbContext : DbContext + static IServiceCollection AddFreeDbContext(this IServiceCollection services, Type dbContextType, Action options) { - - services.AddScoped(sp => + services.AddScoped(dbContextType, sp => { - var ctx = Activator.CreateInstance(); - - if (ctx._orm == null) + var ctx = Activator.CreateInstance(dbContextType) as DbContext; + if (ctx != null && ctx._ormPriv == null) { var builder = new DbContextOptionsBuilder(); options(builder); - ctx._orm = builder._fsql; + ctx._ormPriv = builder._fsql; + ctx._optionsPriv = builder._options; - if (ctx._orm == null) + if (ctx._ormPriv == null) throw new Exception("请在 OnConfiguring 或 AddFreeDbContext 中配置 UseFreeSql"); ctx.InitPropSets(); } - return ctx; }); + return services; + } + public static IServiceCollection AddFreeDbContext(this IServiceCollection services, Action options) where TDbContext : DbContext => + AddFreeDbContext(services, typeof(TDbContext), options); + + public static IServiceCollection AddFreeDbContext(this IServiceCollection services, Action options, Assembly[] assemblies) + { + if (assemblies?.Any() == true) + foreach (var asse in assemblies) + foreach (var dbType in asse.GetTypes().Where(a => a.IsAbstract == false && typeof(DbContext).IsAssignableFrom(a))) + AddFreeDbContext(services, dbType, options); return services; } } diff --git a/FreeSql.DbContext/Repository/ContextSet/RepositoryDbContext.cs b/FreeSql.DbContext/Repository/ContextSet/RepositoryDbContext.cs index 643850d2..6b31772a 100644 --- a/FreeSql.DbContext/Repository/ContextSet/RepositoryDbContext.cs +++ b/FreeSql.DbContext/Repository/ContextSet/RepositoryDbContext.cs @@ -8,13 +8,13 @@ namespace FreeSql internal class RepositoryDbContext : DbContext { - protected IBaseRepository _repos; - public RepositoryDbContext(IFreeSql orm, IBaseRepository repos) : base() + protected IBaseRepository _repo; + public RepositoryDbContext(IFreeSql orm, IBaseRepository repo) : base() { - _orm = orm; - _repos = repos; + _ormPriv = orm; _isUseUnitOfWork = false; - _uowPriv = _repos.UnitOfWork; + UnitOfWork = _repo.UnitOfWork; + _repo = repo; } @@ -24,21 +24,22 @@ namespace FreeSql { if (_dicSet.ContainsKey(entityType)) return _dicSet[entityType]; - var tb = _orm.CodeFirst.GetTableByEntity(entityType); + var tb = _ormPriv.CodeFirst.GetTableByEntity(entityType); if (tb == null) return null; - object repos = _repos; - if (entityType != _repos.EntityType) + object repo = _repo; + if (entityType != _repo.EntityType) { - repos = Activator.CreateInstance(typeof(DefaultRepository<,>).MakeGenericType(entityType, typeof(int)), _repos.Orm); - (repos as IBaseRepository).UnitOfWork = _repos.UnitOfWork; - GetRepositoryDbField(entityType).SetValue(repos, this); + repo = Activator.CreateInstance(typeof(DefaultRepository<,>).MakeGenericType(entityType, typeof(int)), _repo.Orm); + (repo as IBaseRepository).UnitOfWork = _repo.UnitOfWork; + GetRepositoryDbField(entityType).SetValue(repo, this); - typeof(RepositoryDbContext).GetMethod("SetRepositoryDataFilter").MakeGenericMethod(_repos.EntityType) - .Invoke(null, new object[] { repos, _repos }); + typeof(RepositoryDbContext).GetMethod("SetRepositoryDataFilter").MakeGenericMethod(_repo.EntityType) + .Invoke(null, new object[] { repo, _repo }); } - var sd = Activator.CreateInstance(typeof(RepositoryDbSet<>).MakeGenericType(entityType), repos) as IDbSet; + var sd = Activator.CreateInstance(typeof(RepositoryDbSet<>).MakeGenericType(entityType), repo) as IDbSet; + _listSet.Add(sd); if (entityType != typeof(object)) _dicSet.Add(entityType, sd); return sd; } diff --git a/FreeSql.DbContext/Repository/ContextSet/RepositoryDbSet.cs b/FreeSql.DbContext/Repository/ContextSet/RepositoryDbSet.cs index d88188ba..195ae85a 100644 --- a/FreeSql.DbContext/Repository/ContextSet/RepositoryDbSet.cs +++ b/FreeSql.DbContext/Repository/ContextSet/RepositoryDbSet.cs @@ -8,60 +8,59 @@ namespace FreeSql internal class RepositoryDbSet : DbSet where TEntity : class { - protected BaseRepository _repos; - public RepositoryDbSet(BaseRepository repos) + protected BaseRepository _repo; + public RepositoryDbSet(BaseRepository repo) { - _ctx = repos._db; - _fsql = repos.Orm; - _uow = repos.UnitOfWork; - _repos = repos; + _db = repo._db; + _uow = repo.UnitOfWork; + _repo = repo; } protected override ISelect OrmSelect(object dywhere) { var select = base.OrmSelect(dywhere); - var filters = (_repos.DataFilter as DataFilter)._filters.Where(a => a.Value.IsEnabled == true); + var filters = (_repo.DataFilter as DataFilter)._filters.Where(a => a.Value.IsEnabled == true); foreach (var filter in filters) select.Where(filter.Value.Expression); - return select.AsTable(_repos.AsTableSelectInternal); + return select.AsTable(_repo.AsTableSelectInternal); } internal ISelect OrmSelectInternal(object dywhere) => OrmSelect(dywhere); protected override IUpdate OrmUpdate(IEnumerable entitys) { var update = base.OrmUpdate(entitys); - var filters = (_repos.DataFilter as DataFilter)._filters.Where(a => a.Value.IsEnabled == true); + var filters = (_repo.DataFilter as DataFilter)._filters.Where(a => a.Value.IsEnabled == true); foreach (var filter in filters) { if (entitys != null) foreach (var entity in entitys) if (filter.Value.ExpressionDelegate?.Invoke(entity) == false) - throw new Exception($"FreeSql.Repository Update 失败,因为设置了过滤器 {filter.Key}: {filter.Value.Expression},更新的数据不符合 {_fsql.GetEntityString(_entityType, entity)}"); + throw new Exception($"FreeSql.Repository Update 失败,因为设置了过滤器 {filter.Key}: {filter.Value.Expression},更新的数据不符合 {_db.Orm.GetEntityString(_entityType, entity)}"); update.Where(filter.Value.Expression); } - return update.AsTable(_repos.AsTableInternal); + return update.AsTable(_repo.AsTableInternal); } internal IUpdate OrmUpdateInternal(IEnumerable entitys) => OrmUpdate(entitys); protected override IDelete OrmDelete(object dywhere) { var delete = base.OrmDelete(dywhere); - var filters = (_repos.DataFilter as DataFilter)._filters.Where(a => a.Value.IsEnabled == true); + var filters = (_repo.DataFilter as DataFilter)._filters.Where(a => a.Value.IsEnabled == true); foreach (var filter in filters) delete.Where(filter.Value.Expression); - return delete.AsTable(_repos.AsTableInternal); + return delete.AsTable(_repo.AsTableInternal); } internal IDelete OrmDeleteInternal(object dywhere) => OrmDelete(dywhere); protected override IInsert OrmInsert(TEntity entity) => OrmInsert(new[] { entity }); protected override IInsert OrmInsert(IEnumerable entitys) { var insert = base.OrmInsert(entitys); - var filters = (_repos.DataFilter as DataFilter)._filters.Where(a => a.Value.IsEnabled == true); + var filters = (_repo.DataFilter as DataFilter)._filters.Where(a => a.Value.IsEnabled == true); foreach (var filter in filters) { if (entitys != null) foreach (var entity in entitys) if (filter.Value.ExpressionDelegate?.Invoke(entity) == false) - throw new Exception($"FreeSql.Repository Insert 失败,因为设置了过滤器 {filter.Key}: {filter.Value.Expression},插入的数据不符合 {_fsql.GetEntityString(_entityType, entity)}"); + throw new Exception($"FreeSql.Repository Insert 失败,因为设置了过滤器 {filter.Key}: {filter.Value.Expression},插入的数据不符合 {_db.Orm.GetEntityString(_entityType, entity)}"); } - return insert.AsTable(_repos.AsTableInternal); + return insert.AsTable(_repo.AsTableInternal); } internal IInsert OrmInsertInternal(TEntity entity) => OrmInsert(entity); internal IInsert OrmInsertInternal(IEnumerable entitys) => OrmInsert(entitys); diff --git a/FreeSql.DbContext/Repository/ContextSet/RepositoryUnitOfWork.cs b/FreeSql.DbContext/Repository/ContextSet/RepositoryUnitOfWork.cs index 7166ef2c..5fcebda7 100644 --- a/FreeSql.DbContext/Repository/ContextSet/RepositoryUnitOfWork.cs +++ b/FreeSql.DbContext/Repository/ContextSet/RepositoryUnitOfWork.cs @@ -42,23 +42,23 @@ namespace FreeSql public GuidRepository GetGuidRepository(Expression> filter = null, Func asTable = null) where TEntity : class { - var repos = new GuidRepository(_fsql, filter, asTable); - repos.UnitOfWork = this; - return repos; + var repo = new GuidRepository(_fsql, filter, asTable); + repo.UnitOfWork = this; + return repo; } public DefaultRepository GetRepository(Expression> filter = null) where TEntity : class { - var repos = new DefaultRepository(_fsql, filter); - repos.UnitOfWork = this; - return repos; + var repo = new DefaultRepository(_fsql, filter); + repo.UnitOfWork = this; + return repo; } public BaseRepository GetRepository(Expression> filter = null) where TEntity : class { - var repos = new DefaultRepository(_fsql, filter); - repos.UnitOfWork = this; - return repos; + var repo = new DefaultRepository(_fsql, filter); + repo.UnitOfWork = this; + return repo; } } } diff --git a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs index 78021b76..95184e44 100644 --- a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs @@ -10,10 +10,11 @@ namespace FreeSql where TEntity : class { - internal RepositoryDbContext _dbPriv; + RepositoryDbContext _dbPriv; internal RepositoryDbContext _db => _dbPriv ?? (_dbPriv = new RepositoryDbContext(Orm, this)); - internal RepositoryDbSet _dbsetPriv; + RepositoryDbSet _dbsetPriv; internal RepositoryDbSet _dbset => _dbsetPriv ?? (_dbsetPriv = _db.Set() as RepositoryDbSet); + public IDataFilter DataFilter { get; } = new DataFilter(); Func _asTableVal; protected Func AsTable @@ -39,14 +40,12 @@ namespace FreeSql AsTable = asTable; } - ~BaseRepository() - { - this.Dispose(); - } + ~BaseRepository() => this.Dispose(); bool _isdisposed = false; public void Dispose() { if (_isdisposed) return; + _isdisposed = true; try { _dbsetPriv?.Dispose(); @@ -55,7 +54,6 @@ namespace FreeSql } finally { - _isdisposed = true; GC.SuppressFinalize(this); } }