当前 EntityBuilder 在生成业务类(.Biz.cs)时,已经能够根据表中是否存在 TenantId 字段自动添加 TenantInterceptor:
if (ns.Contains("TenantId"))
WriteLine("Meta.Interceptors.Add<TenantInterceptor>();");
但是,生成的业务类声明中并不会自动实现 ITenantScope 接口。开发者需要每次手动修改生成的 .Biz.cs,例如:
public partial class Department : Entity<Department>, ITenantScope
这容易遗漏,且与 TenantInterceptor 的自动注入逻辑不一致。
期望行为
当表中包含 TenantId 字段时,自动将业务类的基类声明追加 ITenantScope,生成结果如下:
public partial class SomeEntity : Entity<SomeEntity>, ITenantScope
同时在静态构造函数中保持已有的:
Meta.Interceptors.Add<TenantInterceptor>();
建议实现
在 XCode/Code/EntityBuilder.cs 的 GetBaseClass() 方法中,针对业务类增加多租户判断:
// 多租户表额外实现 ITenantScope 接口
if (Table.Columns.Any(e => e.Name.EqualIgnoreCase("TenantId")) && !name.Contains("ITenantScope"))
name += ", ITenantScope";
判断规则
• 以 不区分大小写 的方式匹配列名 TenantId。
• 仅在生成 业务类(Biz.cs) 时追加接口,数据类(.cs)保持现状。
• 如果基类中已包含 ITenantScope,则避免重复添加。
影响范围
• 对已有无 TenantId 字段的表无任何影响。
• 对 Tenant 表本身(无 TenantId 列,而是通过 Id 映射)不自动处理,仍需手写显式接口实现,符合其特殊性。
相关文件
• XCode/Code/EntityBuilder.cs
• XUnitTest.XCode/Code/Entity/部门.Biz.cs
• XUnitTest.XCode/Code/Entity/角色.Biz.cs
• XUnitTest.XCode/Code/Entity/租户关系.Biz.cs
当前 EntityBuilder 在生成业务类(.Biz.cs)时,已经能够根据表中是否存在 TenantId 字段自动添加 TenantInterceptor:
但是,生成的业务类声明中并不会自动实现 ITenantScope 接口。开发者需要每次手动修改生成的 .Biz.cs,例如:
这容易遗漏,且与 TenantInterceptor 的自动注入逻辑不一致。
期望行为
当表中包含 TenantId 字段时,自动将业务类的基类声明追加 ITenantScope,生成结果如下:
同时在静态构造函数中保持已有的:
建议实现
在 XCode/Code/EntityBuilder.cs 的 GetBaseClass() 方法中,针对业务类增加多租户判断:
判断规则
• 以 不区分大小写 的方式匹配列名 TenantId。
• 仅在生成 业务类(Biz.cs) 时追加接口,数据类(.cs)保持现状。
• 如果基类中已包含 ITenantScope,则避免重复添加。
影响范围
• 对已有无 TenantId 字段的表无任何影响。
• 对 Tenant 表本身(无 TenantId 列,而是通过 Id 映射)不自动处理,仍需手写显式接口实现,符合其特殊性。
相关文件
• XCode/Code/EntityBuilder.cs
• XUnitTest.XCode/Code/Entity/部门.Biz.cs
• XUnitTest.XCode/Code/Entity/角色.Biz.cs
• XUnitTest.XCode/Code/Entity/租户关系.Biz.cs