Hello,
Thank you very much for the detailed explanation.
Using the options input with a custom windowClass and applying the width override in global styles resolved the issue perfectly. We can now control the width of a single <abp-modal> without affecting other modals, exactly as needed.
Really appreciate the clear guidance and references provided.
Best regards,
Hello ABP Team,
We are working with ABP Framework (Angular UI) and using the built-in <abp-modal> component.
We need to increase the width of a single modal only, without affecting other modals globally.
🔍 What we are trying to achieve
Make one specific modal wider (XL / ~90% viewport width)
Keep all other modals unchanged
Use supported / recommended ABP approach
Avoid hacks or deprecated Angular features
This modal contains complex content (tabs + editable tables), so the default width is too restrictive for a good UX.
🧪 What we have already tried
size="xl"
<abp-modal size="xl">
➡️ No effect.
dialogClass input
<abp-modal [dialogClass]="'modal-xl'">
➡️ Angular compilation error: Can't bind to 'dialogClass' since it isn't a known property of 'abp-modal'.
CSS via component SCSS
.concept-modal-xl .modal-dialog { max-width: 90vw; }
➡️ No effect due to ViewEncapsulation and modal being rendered outside the component DOM.
CSS via global styles (styles.scss / theme.scss)
.modal-xl .modal-dialog { max-width: 90vw; }
➡️ Works only if applied globally, but this affects all modals, which we want to avoid.
modalClass attribute (as per documentation)
<abp-modal modalClass="modal-xl">
➡️ No visual change in width.
📖 Documentation referenced
https://abp.io/docs/latest/framework/ui/angular/modal
We followed the documentation, but we couldn’t find a clear, working example of how to change the width of only one specific <abp-modal>.
❓ Our questions
What is the official and supported way to change the width of a specific <abp-modal> in ABP Angular?
Is there a way to pass custom options to the underlying NgbModal (e.g. windowClass, size, or similar)?
If this is not supported, what is the recommended alternative for complex editors that require wider layouts?
🛠 Environment
ABP Framework: latest
UI: Angular
Theme: Lepton
Bootstrap: v5
Thank you very much. We appreciate guidance on the correct ABP-recommended approach.
Best regards.
Hello, I need assistance with a multi-tenant issue that I can no longer resolve.
I reverted all recent changes and restored the project to the exact state it had when tenant-specific databases were working correctly. However, even after fully rolling back everything, the system still does not use the tenant databases.
The behavior is the following:
The system successfully creates the database for each tenant when the connection string is defined.
The connection strings appear correctly in the tables SaasTenants and SaasTenantConnectionStrings, including a valid “Default” entry for each tenant.
All entities implement IMultiTenant, and no DbContext contains hard-coded connection strings.
Despite this, ABP always writes and reads data from the Host database, completely ignoring the tenant’s “Default” connection string.
Tenant databases remain empty because they are never used.
This issue persists even after restoring the project to the original version where everything previously worked.
No matter which tenant I log in as, EF Core operations (insert/update/select) still target the Host DB.
In short:
ABP creates the tenant databases, but the application never switches to them — all data continues going to the Host DB even after reverting every change.
I would appreciate guidance on what could cause ABP to stop switching the connection string per tenant, even after a full rollback.
We are using ABP 8.x (or 9/10.x if applicable) with the SaaS module enabled and database-per-tenant architecture. The tenant is correctly created, and the table SaasTenantConnectionStrings contains a valid "Default" connection string for that TenantId.
However, during runtime ABP is not switching the connection string. All data is always saved into the Host database regardless of the tenant connection string.
What we already verified
The tenant exists in SaasTenants.
The connection string exists in SaasTenantConnectionStrings with Name = "Default".
The connection string points to a different database and that database exists.
Permissions and authentication are working correctly.
Requests are successfully authenticated and the application resolves the user identity, but data is still persisted in the Host DB.
Expected behavior
ABP should switch the connection string when a tenant is resolved, and EF Core should write data into the tenant's isolated database.
Actual behavior
ABP always uses the Host database even though a tenant-specific connection string is present. No exceptions are thrown. EF Core always connects to the Host DB.
Additional notes
The issue occurs even when calling the application service methods that use CurrentTenant.
We confirmed that the connection string for the tenant is correct by testing it manually.
We also checked the DbContext configuration and module configuration, but ABP still ignores the tenant connection string.
No domain resolution or pipeline configuration seems to affect the problem; the behavior is consistent.
Request
We need assistance validating:
Whether ABP is correctly resolving the tenant in the current HTTP request.
Whether EF Core is correctly switching the connection string for the DbContext.
Whether there is any misconfiguration in our DbContext, module setup, or multitenancy configuration that prevents ABP from using the tenant connection string.
Please advise how to debug or what additional logs to produce so we can identify why ABP always uses the Host database.
The ABP application host cannot reach the remote SQL Server because the required TCP port is not open / reachable.
This explains the behavior:
Using localhost works → The API host can reach the SQL instance immediately.
Using the remote connection string fails → ABP rejects the string as “invalid” because the host cannot establish a TCP connection to the SQL server.
It does not depend on permissions → I can save other connection strings (e.g., localhost) in the same session with the same user.
The PUT endpoint only fails for the remote connection → The same user, same role, same claims, same token can save local DBs successfully.
The error appears ONLY when the SQL server is remote → This confirms that the network path, not ABP permissions, is blocking the connection.
So, the 403 response from:
PUT /api/saas/tenants/{id}/connection-strings
is triggered because ABP internally considers the connection string invalid, due to the SQL host being unreachable from the application server (port closed, SQL Browser unreachable, or firewall blocking).
Once the required SQL port is opened and reachable, the connection string should save correctly.
Hello ABP Team,
I would like to request support regarding two related issues with SaaS tenant connection strings in ABP Commercial.
When using the Angular UI to configure a tenant's connection string:
The endpoint CheckConnectionStringAsync is called correctly.
The backend validates the connection successfully (returns true).
However, when clicking Save, the Angular application never sends the PUT request:
PUT /api/saas/tenants/{id}/connection-strings
This PUT action never appears in browser Network logs, and therefore the backend never receives it.
Permissions are not the problem — my admin role has all SaaS tenant permissions including ManageConnectionStrings.
Questions:
Under what conditions does the Angular SaaS UI skip the PUT request?
Does the UI require the connection string name to always be "Default"?
If the database already contains a connection string with a different name (e.g., "Financial"), does the UI ignore it and therefore never trigger the update?
Is this a known issue in the current ABP Angular version?
I am trying to use a remote SQL Server instance with the following format:
Server=45.xxx.xxx.xxx\SQLEXPRESS2014;Database=Financial;User Id=xxx;Password=xxx;TrustServerCertificate=True;
The CheckConnectionString endpoint returns TRUE, so the connection works.
However, I want to confirm the expected/official behavior:
Questions:
Does ABP support SQL Server remote instances using IP\InstanceName format, or is ABP officially limited to localhost connections?
If ABP supports remote SQL servers, what is the correct recommended connection-string format for:
Named instances?
SQL Browser disabled?
Specific ports?
When using:
Server=45.xxx.xxx.xxx\InstanceName;
should ABP automatically resolve the SQL Browser port, or must the instance be accessed using:
Server=45.xxx.xxx.xxx,PortNumber;
Is there any known limitation in ABP SaaS tenant connection-string checking related to remote or named SQL Server instances?
Additional context
ABP Commercial 8.x
Frontend: Angular
Backend: ASP.NET Core
Multi-tenancy enabled (Database-per-tenant mode)
CheckConnectionString works fine in all tests
The actual save/PUT never happens
I can provide a SQL dump of SaasTenantConnectionStrings if needed
Thank you very much, I will wait for your guidance.
Thank you, everything is working correctly now.
One more question: Where can I find the backend logs generated by ABP? I would like to inspect runtime errors coming from the HttpApi.Host and the application layer.
Thank you — the checklist you provided resolved my issue for now. Running the DbMigrator first and aligning all connection strings fixed the inconsistent initialization and the missing admin/client records.
I have one additional question:
How should I properly regenerate the client-side proxies after creating a new application service?
In previous ABP versions I used commands like:
abp generate-proxy
or (for Angular)
abp generate-proxy -t ng
But I want to confirm the correct and recommended way in the current framework version, especially when using Angular + HttpApi.Host.
Thanks again for your help — your previous guidance was very useful.
Hello, I am working on an ABP project (version Pro - Team License). Yesterday everything worked perfectly: I created new entities, generated migrations, updated the database, ran the API, and both Swagger and the Angular UI loaded without issues. I could log in normally using the default admin user.
Today, after reopening the solution, the API behaves unexpectedly:
Swagger and the Angular logo no longer appear when running the API. It looks like the application is not initializing properly.
When I try to log in, I receive an error saying that the ClientId is missing, as if the default OpenIddict client was never seeded.
I tried dropping and recreating the database (using Update-Database):
Sometimes it works, sometimes it does not.
Most of the time, the default admin user is NOT created, which should happen during the DataSeeder execution.
I did not change anything related to authentication, database configuration, or appsettings between yesterday and today.
It seems like:
the DataSeeder is not being executed reliably,
or the project is not connecting to the database during startup,
or OpenIddict initialization is failing silently, causing the Client and admin user seeding to be skipped.
Could you help me understand why the initialization is inconsistent and why the default admin user and default clients are not being created when recreating the DB?
Thank you.