- 增加 IBaseRepository.AsTable 重载方法支持多表表名设置;

This commit is contained in:
2881099 2023-12-12 20:45:35 +08:00
parent 78f1f3d856
commit 1a0507d621
6 changed files with 43 additions and 117 deletions

View File

@ -552,6 +552,12 @@
</summary> </summary>
<param name="rule"></param> <param name="rule"></param>
</member> </member>
<member name="M:FreeSql.IBaseRepository.AsTable(System.Func{System.Type,System.String,System.String})">
<summary>
分表规则,参数:实体类型、旧表名;返回:新表名 https://github.com/2881099/FreeSql/wiki/Repository
</summary>
<param name="rule"></param>
</member>
<member name="P:FreeSql.IBaseRepository.DbContextOptions"> <member name="P:FreeSql.IBaseRepository.DbContextOptions">
<summary> <summary>
设置 DbContext 选项 设置 DbContext 选项

View File

@ -18,8 +18,9 @@ namespace FreeSql
_repo = repo; _repo = repo;
} }
static ConcurrentDictionary<Type, FieldInfo> _dicGetRepositoryDbField = new ConcurrentDictionary<Type, FieldInfo>(); static ConcurrentDictionary<Type, ConcurrentDictionary<string, FieldInfo>> _dicGetRepositoryDbField = new ConcurrentDictionary<Type, ConcurrentDictionary<string, FieldInfo>>();
static FieldInfo GetRepositoryDbField(Type type) => _dicGetRepositoryDbField.GetOrAdd(type, tp => typeof(BaseRepository<,>).MakeGenericType(tp, typeof(int)).GetField("_dbPriv", BindingFlags.Instance | BindingFlags.NonPublic)); static FieldInfo GetRepositoryDbField(Type type, string fieldName) => _dicGetRepositoryDbField.GetOrAdd(type, tp => new ConcurrentDictionary<string, FieldInfo>()).GetOrAdd(fieldName, fn =>
typeof(BaseRepository<,>).MakeGenericType(type, typeof(int)).GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic));
public override IDbSet Set(Type entityType) public override IDbSet Set(Type entityType)
{ {
if (_dicSet.ContainsKey(entityType)) return _dicSet[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 = Activator.CreateInstance(typeof(DefaultRepository<,>).MakeGenericType(entityType, typeof(int)), _repo.Orm);
(repo as IBaseRepository).UnitOfWork = _repo.UnitOfWork; (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())) if (typeof(IBaseRepository<>).MakeGenericType(_repo.EntityType).IsAssignableFrom(_repo.GetType()))
typeof(RepositoryDbContext).GetMethod("SetRepositoryDataFilter").MakeGenericMethod(_repo.EntityType) typeof(RepositoryDbContext).GetMethod("SetRepositoryDataFilter").MakeGenericMethod(_repo.EntityType)

View File

@ -30,8 +30,8 @@ namespace FreeSql
protected override ISelect<TEntity> OrmSelect(object dywhere) protected override ISelect<TEntity> 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<TEntity>)._filters; var filters = (_repo.DataFilter as DataFilter<TEntity>)._filters;
foreach (var filter in filters.Where(a => a.Value.IsEnabled == true)) select.Where(filter.Value.Expression); 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(); var disableFilter = filters.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToList();
@ -42,7 +42,8 @@ namespace FreeSql
internal ISelect<TEntity> OrmSelectInternal(object dywhere) => OrmSelect(dywhere); internal ISelect<TEntity> OrmSelectInternal(object dywhere) => OrmSelect(dywhere);
protected override IUpdate<TEntity> OrmUpdate(IEnumerable<TEntity> entitys) protected override IUpdate<TEntity> OrmUpdate(IEnumerable<TEntity> 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<TEntity>)._filters; var filters = (_repo.DataFilter as DataFilter<TEntity>)._filters;
foreach (var filter in filters.Where(a => a.Value.IsEnabled == true)) update.Where(filter.Value.Expression); 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(); var disableFilter = filters.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToList();
@ -53,8 +54,9 @@ namespace FreeSql
internal IUpdate<TEntity> OrmUpdateInternal(IEnumerable<TEntity> entitys) => OrmUpdate(entitys); internal IUpdate<TEntity> OrmUpdateInternal(IEnumerable<TEntity> entitys) => OrmUpdate(entitys);
protected override IDelete<TEntity> OrmDelete(object dywhere) protected override IDelete<TEntity> OrmDelete(object dywhere)
{ {
var delete = base.OrmDelete(dywhere).AsTable(_repo.AsTableValueInternal); var delete = base.OrmDelete(dywhere);
var filters = (_repo.DataFilter as DataFilter<TEntity>)._filters; if (_repo._asTablePriv != null) delete.AsTable(old => _repo._asTablePriv(_entityType, old));
var filters = (_repo.DataFilter as DataFilter<TEntity>)._filters;
foreach (var filter in filters.Where(a => a.Value.IsEnabled == true)) delete.Where(filter.Value.Expression); 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(); var disableFilter = filters.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToList();
disableFilter.AddRange((_repo.DataFilter as DataFilter<TEntity>)._filtersByOrm.Where(a => a.Value.IsEnabled == false).Select(a => a.Key)); disableFilter.AddRange((_repo.DataFilter as DataFilter<TEntity>)._filtersByOrm.Where(a => a.Value.IsEnabled == false).Select(a => a.Key));
@ -65,8 +67,9 @@ namespace FreeSql
protected override IInsert<TEntity> OrmInsert(TEntity entity) => OrmInsert(new[] { entity }); protected override IInsert<TEntity> OrmInsert(TEntity entity) => OrmInsert(new[] { entity });
protected override IInsert<TEntity> OrmInsert(IEnumerable<TEntity> entitys) protected override IInsert<TEntity> OrmInsert(IEnumerable<TEntity> entitys)
{ {
var insert = base.OrmInsert(entitys).AsTable(_repo.AsTableValueInternal); var insert = base.OrmInsert(entitys);
var filters = (_repo.DataFilter as DataFilter<TEntity>)._filters.Where(a => a.Value.IsEnabled == true); if (_repo._asTablePriv != null) insert.AsTable(old => _repo._asTablePriv(_entityType, old));
var filters = (_repo.DataFilter as DataFilter<TEntity>)._filters.Where(a => a.Value.IsEnabled == true);
foreach (var filter in filters) foreach (var filter in filters)
{ {
if (entitys != null) if (entitys != null)

View File

@ -18,8 +18,7 @@ namespace FreeSql
internal RepositoryDbSet<TEntity> _dbset => _dbsetPriv ?? (_dbsetPriv = _db.Set<TEntity>() as RepositoryDbSet<TEntity>); internal RepositoryDbSet<TEntity> _dbset => _dbsetPriv ?? (_dbsetPriv = _db.Set<TEntity>() as RepositoryDbSet<TEntity>);
public IDataFilter<TEntity> DataFilter { get; } = new DataFilter<TEntity>(); public IDataFilter<TEntity> DataFilter { get; } = new DataFilter<TEntity>();
internal Func<string, string> AsTableValueInternal { get; private set; } internal Func<Type, string, string> _asTablePriv;
internal Func<Type, string, string> AsTableSelectValueInternal { get; private set; }
protected void ApplyDataFilter(string name, Expression<Func<TEntity, bool>> exp) => DataFilter.Apply(name, exp); protected void ApplyDataFilter(string name, Expression<Func<TEntity, bool>> exp) => DataFilter.Apply(name, exp);
@ -60,10 +59,18 @@ namespace FreeSql
public void AsType(Type entityType) => _dbset.AsType(entityType); public void AsType(Type entityType) => _dbset.AsType(entityType);
public void AsTable(Func<string, string> rule) public void AsTable(Func<string, string> rule)
{ {
AsTableValueInternal = rule; if (rule == null)
AsTableSelectValueInternal = rule == null ? null : new Func<Type, string, string>((a, b) => a == EntityType ? rule(b) : 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<Type, string, string> rule)
{
_asTablePriv = rule;
}
public DbContextOptions DbContextOptions { get => _db.Options; set => _db.Options = value; }
internal DbContextScopedFreeSql _ormScoped; internal DbContextScopedFreeSql _ormScoped;
internal IFreeSql OrmOriginal => _ormScoped?._originalFsql; internal IFreeSql OrmOriginal => _ormScoped?._originalFsql;

View File

@ -24,11 +24,16 @@ namespace FreeSql
/// </summary> /// </summary>
/// <param name="rule"></param> /// <param name="rule"></param>
void AsTable(Func<string, string> rule); void AsTable(Func<string, string> rule);
/// <summary>
/// 分表规则,参数:实体类型、旧表名;返回:新表名 https://github.com/2881099/FreeSql/wiki/Repository
/// </summary>
/// <param name="rule"></param>
void AsTable(Func<Type, string, string> rule);
/// <summary> /// <summary>
/// 设置 DbContext 选项 /// 设置 DbContext 选项
/// </summary> /// </summary>
DbContextOptions DbContextOptions { get; set; } DbContextOptions DbContextOptions { get; set; }
} }
public interface IBaseRepository<TEntity> : IBaseRepository public interface IBaseRepository<TEntity> : IBaseRepository

View File

@ -1104,82 +1104,6 @@
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="T:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder">
<summary>
动态创建实体类型
</summary>
</member>
<member name="M:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.#ctor(IFreeSql,System.String,System.Attribute[])">
<summary>
配置Class
</summary>
<param name="className">类名</param>
<param name="attributes">类标记的特性[Table(Name = "xxx")] [Index(xxxx)]</param>
<returns></returns>
</member>
<member name="M:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.Property(System.String,System.Type,System.Attribute[])">
<summary>
配置属性
</summary>
<param name="propertyName">属性名称</param>
<param name="propertyType">属性类型</param>
<param name="attributes">属性标记的特性-支持多个</param>
<returns></returns>
</member>
<member name="M:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.Property(System.String,System.Type,System.Boolean,System.Attribute[])">
<summary>
配置属性
</summary>
<param name="propertyName">属性名称</param>
<param name="propertyType">属性类型</param>
<param name="isOverride">该属性是否重写父类属性</param>
<param name="attributes">属性标记的特性-支持多个</param>
<returns></returns>
</member>
<member name="M:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.Property(System.String,System.Type,System.Boolean,System.Object,System.Attribute[])">
<summary>
配置属性
</summary>
<param name="propertyName">属性名称</param>
<param name="propertyType">属性类型</param>
<param name="isOverride">该属性是否重写父类属性</param>
<param name="defaultValue">属性默认值</param>
<param name="attributes">属性标记的特性-支持多个</param>
<returns></returns>
</member>
<member name="M:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.Extend(System.Type)">
<summary>
配置父类
</summary>
<param name="superClass">父类类型</param>
<returns></returns>
</member>
<member name="M:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.OverrideProperty(System.Reflection.Emit.TypeBuilder@,System.Reflection.Emit.MethodBuilder,FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.PropertyMethodEnum,System.String)">
<summary>
Override属性
</summary>
<param name="typeBuilder"></param>
</member>
<member name="M:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.Build">
<summary>
Emit动态创建出Class - Type
</summary>
<returns></returns>
</member>
<member name="M:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.FirstCharToLower(System.String)">
<summary>
首字母小写
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.FirstCharToUpper(System.String)">
<summary>
首字母大写
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:FreeSql.Extensions.EntityUtil.EntityUtilExtensions.GetEntityKeyString(IFreeSql,System.Type,System.Object,System.Boolean,System.String)"> <member name="M:FreeSql.Extensions.EntityUtil.EntityUtilExtensions.GetEntityKeyString(IFreeSql,System.Type,System.Object,System.Boolean,System.String)">
<summary> <summary>
获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null
@ -5884,28 +5808,6 @@
请使用 fsql.InsertDict(dict) 方法插入字典数据 请使用 fsql.InsertDict(dict) 方法插入字典数据
</summary> </summary>
</member> </member>
<member name="M:FreeSqlGlobalDynamicEntityExtensions.DynamicEntity(FreeSql.ICodeFirst,System.String,System.Attribute[])">
<summary>
动态构建Class Type
</summary>
<returns></returns>
</member>
<member name="M:FreeSqlGlobalDynamicEntityExtensions.CreateInstance(FreeSql.Internal.Model.TableInfo,System.Collections.Generic.Dictionary{System.String,System.Object})">
<summary>
根据字典,创建 table 对应的实体对象
</summary>
<param name="table"></param>
<param name="dict"></param>
<returns></returns>
</member>
<member name="M:FreeSqlGlobalDynamicEntityExtensions.CreateDictionary(FreeSql.Internal.Model.TableInfo,System.Object)">
<summary>
根据实体对象,创建 table 对应的字典
</summary>
<param name="table"></param>
<param name="instance"></param>
<returns></returns>
</member>
<member name="M:FreeSqlGlobalExpressionCallExtensions.Between(System.DateTime,System.DateTime,System.DateTime)"> <member name="M:FreeSqlGlobalExpressionCallExtensions.Between(System.DateTime,System.DateTime,System.DateTime)">
<summary> <summary>
C# that >= between &amp;&amp; that &lt;= and<para></para> C# that >= between &amp;&amp; that &lt;= and<para></para>