11using System . Linq . Expressions ;
22using Elsa . Common . Entities ;
3+ using Elsa . Common . Multitenancy ;
34using Microsoft . EntityFrameworkCore ;
45using Microsoft . EntityFrameworkCore . Metadata ;
56
@@ -8,7 +9,7 @@ namespace Elsa.Persistence.EFCore.EntityHandlers;
89/// <summary>
910/// Represents a class that applies a filter to set the TenantId for entities.
1011/// </summary>
11- public class SetTenantIdFilter : IEntityModelCreatingHandler
12+ public class SetTenantIdFilter ( ITenantAccessor ? tenantAccessor ) : IEntityModelCreatingHandler
1213{
1314 /// <inheritdoc />
1415 public void Handle ( ElsaDbContextBase dbContext , ModelBuilder modelBuilder , IMutableEntityType entityType )
@@ -18,26 +19,32 @@ public void Handle(ElsaDbContextBase dbContext, ModelBuilder modelBuilder, IMuta
1819
1920 modelBuilder
2021 . Entity ( entityType . ClrType )
21- . HasQueryFilter ( CreateTenantFilterExpression ( dbContext , entityType . ClrType ) ) ;
22+ . HasQueryFilter ( CreateTenantFilterExpression ( entityType . ClrType ) ) ;
2223 }
2324
24- private LambdaExpression CreateTenantFilterExpression ( ElsaDbContextBase dbContext , Type clrType )
25+ private LambdaExpression CreateTenantFilterExpression ( Type clrType )
2526 {
2627 var parameter = Expression . Parameter ( clrType , "e" ) ;
2728
28- // e => EF.Property<string>(e, "TenantId") == this.TenantId
29+ // e => EF.Property<string>(e, "TenantId") == tenantAccessor.Tenant.Id
2930 var tenantIdProperty = Expression . Call (
3031 typeof ( EF ) ,
3132 nameof ( EF . Property ) ,
3233 [ typeof ( string ) ] ,
3334 parameter ,
3435 Expression . Constant ( "TenantId" ) ) ;
3536
36- var tenantIdOnContext = Expression . Property (
37- Expression . Constant ( dbContext ) ,
38- nameof ( ElsaDbContextBase . TenantId ) ) ;
39-
40- var body = Expression . Equal ( tenantIdProperty , tenantIdOnContext ) ;
37+ // Build an expression that accesses tenantAccessor.Tenant.Id
38+ // This will be evaluated at query time, not at model creation time
39+ var tenantAccessorConstant = Expression . Constant ( tenantAccessor , typeof ( ITenantAccessor ) ) ;
40+ var tenantProperty = Expression . Property ( tenantAccessorConstant , nameof ( ITenantAccessor . Tenant ) ) ;
41+ var tenantIdOnAccessor = Expression . Condition (
42+ Expression . Equal ( tenantProperty , Expression . Constant ( null , typeof ( Tenant ) ) ) ,
43+ Expression . Constant ( null , typeof ( string ) ) ,
44+ Expression . Property ( tenantProperty , nameof ( Tenant . Id ) )
45+ ) ;
46+
47+ var body = Expression . Equal ( tenantIdProperty , tenantIdOnAccessor ) ;
4148
4249 return Expression . Lambda ( body , parameter ) ;
4350 }
0 commit comments