From 1a0507d621614d6434a3b87d45471a2b702b5004 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Tue, 12 Dec 2023 20:45:35 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20IBaseRepository.AsTabl?= =?UTF-8?q?e=20=E9=87=8D=E8=BD=BD=E6=96=B9=E6=B3=95=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=A4=9A=E8=A1=A8=E8=A1=A8=E5=90=8D=E8=AE=BE=E7=BD=AE=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 6 ++ .../ContextSet/RepositoryDbContext.cs | 9 +- .../Repository/ContextSet/RepositoryDbSet.cs | 17 ++-- .../Repository/Repository/BaseRepository.cs | 17 +++- .../Repository/Repository/IBaseRepository.cs | 13 ++- FreeSql/FreeSql.xml | 98 ------------------- 6 files changed, 43 insertions(+), 117 deletions(-) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 26522f10..341e3d36 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -552,6 +552,12 @@ + + + 分表规则,参数:实体类型、旧表名;返回:新表名 https://github.com/2881099/FreeSql/wiki/Repository + + + 设置 DbContext 选项 diff --git a/FreeSql.DbContext/Repository/ContextSet/RepositoryDbContext.cs b/FreeSql.DbContext/Repository/ContextSet/RepositoryDbContext.cs index 2134eee5..14d4556a 100644 --- a/FreeSql.DbContext/Repository/ContextSet/RepositoryDbContext.cs +++ b/FreeSql.DbContext/Repository/ContextSet/RepositoryDbContext.cs @@ -18,8 +18,9 @@ namespace FreeSql _repo = repo; } - static ConcurrentDictionary _dicGetRepositoryDbField = new ConcurrentDictionary(); - static FieldInfo GetRepositoryDbField(Type type) => _dicGetRepositoryDbField.GetOrAdd(type, tp => typeof(BaseRepository<,>).MakeGenericType(tp, typeof(int)).GetField("_dbPriv", BindingFlags.Instance | BindingFlags.NonPublic)); + static ConcurrentDictionary> _dicGetRepositoryDbField = new ConcurrentDictionary>(); + static FieldInfo GetRepositoryDbField(Type type, string fieldName) => _dicGetRepositoryDbField.GetOrAdd(type, tp => new ConcurrentDictionary()).GetOrAdd(fieldName, fn => + typeof(BaseRepository<,>).MakeGenericType(type, typeof(int)).GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic)); public override IDbSet Set(Type entityType) { if (_dicSet.ContainsKey(entityType)) return _dicSet[entityType]; @@ -32,7 +33,9 @@ namespace FreeSql { repo = Activator.CreateInstance(typeof(DefaultRepository<,>).MakeGenericType(entityType, typeof(int)), _repo.Orm); (repo as IBaseRepository).UnitOfWork = _repo.UnitOfWork; - GetRepositoryDbField(entityType).SetValue(repo, this); + GetRepositoryDbField(entityType, "_dbPriv").SetValue(repo, this); + GetRepositoryDbField(entityType, "_asTablePriv").SetValue(repo, + GetRepositoryDbField(_repo.EntityType, "_asTablePriv").GetValue(_repo)); if (typeof(IBaseRepository<>).MakeGenericType(_repo.EntityType).IsAssignableFrom(_repo.GetType())) typeof(RepositoryDbContext).GetMethod("SetRepositoryDataFilter").MakeGenericMethod(_repo.EntityType) diff --git a/FreeSql.DbContext/Repository/ContextSet/RepositoryDbSet.cs b/FreeSql.DbContext/Repository/ContextSet/RepositoryDbSet.cs index 5065e3d0..95e89d5f 100644 --- a/FreeSql.DbContext/Repository/ContextSet/RepositoryDbSet.cs +++ b/FreeSql.DbContext/Repository/ContextSet/RepositoryDbSet.cs @@ -30,8 +30,8 @@ namespace FreeSql protected override ISelect OrmSelect(object dywhere) { - var select = base.OrmSelect(dywhere).AsTable(_repo.AsTableSelectValueInternal); - + var select = base.OrmSelect(dywhere); + if (_repo._asTablePriv != null) select.AsTable(_repo._asTablePriv); var filters = (_repo.DataFilter as DataFilter)._filters; foreach (var filter in filters.Where(a => a.Value.IsEnabled == true)) select.Where(filter.Value.Expression); var disableFilter = filters.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToList(); @@ -42,7 +42,8 @@ namespace FreeSql internal ISelect OrmSelectInternal(object dywhere) => OrmSelect(dywhere); protected override IUpdate OrmUpdate(IEnumerable entitys) { - var update = base.OrmUpdate(entitys).AsTable(_repo.AsTableValueInternal); + var update = base.OrmUpdate(entitys); + if (_repo._asTablePriv != null) update.AsTable(old => _repo._asTablePriv(_entityType, old)); var filters = (_repo.DataFilter as DataFilter)._filters; foreach (var filter in filters.Where(a => a.Value.IsEnabled == true)) update.Where(filter.Value.Expression); var disableFilter = filters.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToList(); @@ -53,8 +54,9 @@ namespace FreeSql internal IUpdate OrmUpdateInternal(IEnumerable entitys) => OrmUpdate(entitys); protected override IDelete OrmDelete(object dywhere) { - var delete = base.OrmDelete(dywhere).AsTable(_repo.AsTableValueInternal); - var filters = (_repo.DataFilter as DataFilter)._filters; + var delete = base.OrmDelete(dywhere); + if (_repo._asTablePriv != null) delete.AsTable(old => _repo._asTablePriv(_entityType, old)); + var filters = (_repo.DataFilter as DataFilter)._filters; foreach (var filter in filters.Where(a => a.Value.IsEnabled == true)) delete.Where(filter.Value.Expression); var disableFilter = filters.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToList(); disableFilter.AddRange((_repo.DataFilter as DataFilter)._filtersByOrm.Where(a => a.Value.IsEnabled == false).Select(a => a.Key)); @@ -65,8 +67,9 @@ namespace FreeSql protected override IInsert OrmInsert(TEntity entity) => OrmInsert(new[] { entity }); protected override IInsert OrmInsert(IEnumerable entitys) { - var insert = base.OrmInsert(entitys).AsTable(_repo.AsTableValueInternal); - var filters = (_repo.DataFilter as DataFilter)._filters.Where(a => a.Value.IsEnabled == true); + var insert = base.OrmInsert(entitys); + if (_repo._asTablePriv != null) insert.AsTable(old => _repo._asTablePriv(_entityType, old)); + var filters = (_repo.DataFilter as DataFilter)._filters.Where(a => a.Value.IsEnabled == true); foreach (var filter in filters) { if (entitys != null) diff --git a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs index 76857637..5a081c62 100644 --- a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs @@ -18,8 +18,7 @@ namespace FreeSql internal RepositoryDbSet _dbset => _dbsetPriv ?? (_dbsetPriv = _db.Set() as RepositoryDbSet); public IDataFilter DataFilter { get; } = new DataFilter(); - internal Func AsTableValueInternal { get; private set; } - internal Func AsTableSelectValueInternal { get; private set; } + internal Func _asTablePriv; protected void ApplyDataFilter(string name, Expression> exp) => DataFilter.Apply(name, exp); @@ -60,10 +59,18 @@ namespace FreeSql public void AsType(Type entityType) => _dbset.AsType(entityType); public void AsTable(Func rule) { - AsTableValueInternal = rule; - AsTableSelectValueInternal = rule == null ? null : new Func((a, b) => a == EntityType ? rule(b) : null); + if (rule == null) + { + _asTablePriv = null; + return; + } + _asTablePriv = (a, b) => a == EntityType ? rule(b) : null; } - public DbContextOptions DbContextOptions { get => _db.Options; set => _db.Options = value; } + public void AsTable(Func rule) + { + _asTablePriv = rule; + } + public DbContextOptions DbContextOptions { get => _db.Options; set => _db.Options = value; } internal DbContextScopedFreeSql _ormScoped; internal IFreeSql OrmOriginal => _ormScoped?._originalFsql; diff --git a/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs b/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs index cecb57f8..695ed247 100644 --- a/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs @@ -24,11 +24,16 @@ namespace FreeSql /// /// void AsTable(Func rule); + /// + /// 分表规则,参数:实体类型、旧表名;返回:新表名 https://github.com/2881099/FreeSql/wiki/Repository + /// + /// + void AsTable(Func rule); - /// - /// 设置 DbContext 选项 - /// - DbContextOptions DbContextOptions { get; set; } + /// + /// 设置 DbContext 选项 + /// + DbContextOptions DbContextOptions { get; set; } } public interface IBaseRepository : IBaseRepository diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index ed01ba68..c423ca76 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1104,82 +1104,6 @@ - - - 动态创建实体类型 - - - - - 配置Class - - 类名 - 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] - - - - - 配置属性 - - 属性名称 - 属性类型 - 属性标记的特性-支持多个 - - - - - 配置属性 - - 属性名称 - 属性类型 - 该属性是否重写父类属性 - 属性标记的特性-支持多个 - - - - - 配置属性 - - 属性名称 - 属性类型 - 该属性是否重写父类属性 - 属性默认值 - 属性标记的特性-支持多个 - - - - - 配置父类 - - 父类类型 - - - - - Override属性 - - - - - - Emit动态创建出Class - Type - - - - - - 首字母小写 - - - - - - - 首字母大写 - - - - 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null @@ -5884,28 +5808,6 @@ 请使用 fsql.InsertDict(dict) 方法插入字典数据 - - - 动态构建Class Type - - - - - - 根据字典,创建 table 对应的实体对象 - - - - - - - - 根据实体对象,创建 table 对应的字典 - - - - - C#: that >= between && that <= and