public static void ShadowProperties(this ModelBuilder modelBuilder) { foreach (var tp in modelBuilder.Model.GetEntityTypes()) { var t = tp.ClrType; // set auditing properties if (typeof(IAuditable).IsAssignableFrom(t)) { var method = SetAuditingShadowPropertiesMethodInfo.MakeGenericMethod(t); method.Invoke(modelBuilder, new object[] { modelBuilder }); } // set tenant properties if (typeof(ITenant).IsAssignableFrom(t)) { var method = SetTenantShadowPropertyMethodInfo.MakeGenericMethod(t); method.Invoke(modelBuilder, new object[] { modelBuilder }); } // set soft delete property if (typeof(ISoftDelete).IsAssignableFrom(t)) { var method = SetIsDeletedShadowPropertyMethodInfo.MakeGenericMethod(t); method.Invoke(modelBuilder, new object[] { modelBuilder }); } } }
/// <summary> /// Add TenantId shadow property to entities that implements IHaveTenant and IMayHaveTenant interfaces /// </summary> /// <param name="modelBuilder"></param> /// <typeparam name="TEntity">Tenant entity</typeparam> /// <param name="entitiesList">A list with all entities</param> public static void MultiTenancy <TEntity>(this ModelBuilder modelBuilder, List <IMutableEntityType> entitiesList) where TEntity : class { foreach (var entityType in entitiesList) { var type = entityType.ClrType; if (typeof(IHaveTenant).IsAssignableFrom(type)) { var method = SetTenantShadowPropertyMethodInfo.MakeGenericMethod(type, typeof(TEntity)); method.Invoke(modelBuilder, new object[] { modelBuilder }); } if (typeof(IMayHaveTenant).IsAssignableFrom(type)) { var method = SetNullableTenantShadowPropertyMethodInfo.MakeGenericMethod(type, typeof(TEntity)); method.Invoke(modelBuilder, new object[] { modelBuilder }); } } }