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