新增SqlSugar扩展(百小僧如果修复可以去除)(必须更新)解决中间件Mapper跨库查询问题
This commit is contained in:
parent
807e4b1c07
commit
d825c5d7e8
56
Admin.NET/Admin.NET.Core/Utils/SqlSugarExtensions.cs
Normal file
56
Admin.NET/Admin.NET.Core/Utils/SqlSugarExtensions.cs
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
|
||||||
|
namespace Admin.NET.Core.Utils;
|
||||||
|
public static class SqlSugarExtensions
|
||||||
|
{
|
||||||
|
private const string DefaultTenantId = "1300000000001";
|
||||||
|
|
||||||
|
public static ISqlSugarClient ForTenant<TEntity>(
|
||||||
|
this ISqlSugarClient db)
|
||||||
|
{
|
||||||
|
var attr = typeof(TEntity).GetCustomAttribute<TenantAttribute>();
|
||||||
|
|
||||||
|
// 当特性不存在时使用默认租户
|
||||||
|
if (attr == null)
|
||||||
|
{
|
||||||
|
return db.AsTenant().GetConnection(DefaultTenantId);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 反射获取租户ID(兼容多种字段命名)
|
||||||
|
var tenantId = GetTenantIdFromAttribute(attr) ?? DefaultTenantId;
|
||||||
|
|
||||||
|
return db.AsTenant().GetConnection(tenantId);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetTenantIdFromAttribute(TenantAttribute attr)
|
||||||
|
{
|
||||||
|
const string tenantIdKey = "TenantId";
|
||||||
|
var type = attr.GetType();
|
||||||
|
|
||||||
|
// 尝试通过属性获取
|
||||||
|
var prop = type.GetProperty(tenantIdKey, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
|
||||||
|
if (prop != null)
|
||||||
|
{
|
||||||
|
return prop.GetValue(attr) as string;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 尝试通过私有字段获取(兼容不同命名规范)
|
||||||
|
var fields = new[]
|
||||||
|
{
|
||||||
|
$"<{tenantIdKey}>k__BackingField", // 编译器生成字段
|
||||||
|
$"_{tenantIdKey.ToLower()}", // 常规私有字段
|
||||||
|
$"m_{tenantIdKey}" // 其他可能的前缀
|
||||||
|
};
|
||||||
|
|
||||||
|
foreach (var fieldName in fields)
|
||||||
|
{
|
||||||
|
var field = type.GetField(fieldName,
|
||||||
|
BindingFlags.NonPublic | BindingFlags.Instance);
|
||||||
|
if (field != null)
|
||||||
|
{
|
||||||
|
return field.GetValue(attr) as string;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -81,11 +81,11 @@ public partial class @(@Model.ClassName)Mid
|
|||||||
@: var key = $"@(@column.FkEntityName)_{t.@(@column.PropertyName)}";
|
@: var key = $"@(@column.FkEntityName)_{t.@(@column.PropertyName)}";
|
||||||
@: if (!sysCacheService.ExistKey(key))
|
@: if (!sysCacheService.ExistKey(key))
|
||||||
@: {
|
@: {
|
||||||
@: var m = db.Queryable<@(@column.FkEntityName)>().FirstAsync(f => f.@(@column.FkLinkColumnName) == t.@(@column.PropertyName));
|
@: var m = db.ForTenant<@(@column.FkEntityName)>().Queryable<@(@column.FkEntityName)>().FirstAsync(f => f.@(@column.FkLinkColumnName) == t.@(@column.PropertyName));
|
||||||
@: if (m != null) sysCacheService.Set(key, m);
|
@: if (m != null) sysCacheService.Set(key, m);
|
||||||
@: }
|
@: }
|
||||||
@: t.@(@column.PropertyName)@(@column.FkColumnName) = sysCacheService.Get<@(@column.FkEntityName)>(key)?.@(@column.FkColumnName);
|
@: t.@(@column.PropertyName)@(@column.FkColumnName) = sysCacheService.Get<@(@column.FkEntityName)>(key)?.@(@column.FkColumnName);
|
||||||
@: //t.@(@column.PropertyName)@(@column.FkColumnName)=db.Queryable<@(@column.FkEntityName)>().FirstAsync(f => f.@(@column.FkLinkColumnName) == t.@(@column.PropertyName))).@(@column.FkColumnName);//
|
@: //t.@(@column.PropertyName)@(@column.FkColumnName)=db.Queryable<@(@column.FkEntityName)>().First(f => f.@(@column.FkLinkColumnName) == t.@(@column.PropertyName))).@(@column.FkColumnName);//
|
||||||
@:})
|
@:})
|
||||||
}
|
}
|
||||||
else if(@column.EffectType == "ApiTreeSelector"){
|
else if(@column.EffectType == "ApiTreeSelector"){
|
||||||
@ -95,7 +95,7 @@ public partial class @(@Model.ClassName)Mid
|
|||||||
@: var key = $"@(@column.FkEntityName)_{t.@(@column.PropertyName)}";
|
@: var key = $"@(@column.FkEntityName)_{t.@(@column.PropertyName)}";
|
||||||
@: if (!sysCacheService.ExistKey(key))
|
@: if (!sysCacheService.ExistKey(key))
|
||||||
@: {
|
@: {
|
||||||
@: var m = db.Queryable<@(@column.FkEntityName)>().FirstAsync(f => f.@(@column.ValueColumn) == t.@(@column.PropertyName));
|
@: var m = db.ForTenant<@(@column.FkEntityName)>().Queryable<@(@column.FkEntityName)>().First(f => f.@(@column.ValueColumn) == t.@(@column.PropertyName));
|
||||||
@: if (m != null) sysCacheService.Set(key, m);
|
@: if (m != null) sysCacheService.Set(key, m);
|
||||||
@: }
|
@: }
|
||||||
@: t.@(@column.PropertyName)@(@column.DisplayColumn) = sysCacheService.Get<@(@column.FkEntityName)>(key)?.@(@column.DisplayColumn);
|
@: t.@(@column.PropertyName)@(@column.DisplayColumn) = sysCacheService.Get<@(@column.FkEntityName)>(key)?.@(@column.DisplayColumn);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user