The issue occurs because Oracle does not support the native BOOLEAN type in table columns. When ABP/EF Core tries to create tables with BOOLEAN columns, Oracle throws an error (ORA-00902: invalid datatype).
To resolve this, you must map boolean properties to a supported Oracle type, such as NUMBER(1) or NUMBER(10), instead of BOOLEAN.
ABP provides guidance for Oracle EF Core integration. You should use the Devart provider and follow the official documentation to handle type mapping issues.
Steps to fix:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
foreach (var property in entityType.GetProperties())
{
if (property.ClrType == typeof(bool) || property.ClrType == typeof(bool?))
{
property.SetColumnType("NUMBER(1)");
}
}
}
}
This approach will allow your ABP application to work with Oracle without manual table edits for every boolean property.
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.
To use SignalR behind Nginx with ABP on Linux, you need to ensure both your Nginx configuration and your application's Content Security Policy (CSP) are set up to allow WebSocket connections.
Solution:
Nginx Configuration for WebSockets
Make sure your Nginx reverse proxy forwards WebSocket connections. Add the following to your Nginx site configuration for the SignalR endpoint:
location /signalr-hubs/ {
proxy_pass http://your_backend_server;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
Replace your_backend_server with the internal address of your SignalR service.
Content Security Policy (CSP) Update
The error message indicates your CSP is blocking wss:// connections. Update your CSP header to explicitly allow WebSocket connections from your SignalR domain. For example:
Content-Security-Policy: default-src 'self' http: https: data: blob: 'unsafe-inline'; connect-src 'self' wss://signalr.mydomain.com https://signalr.mydomain.com;
Add or update the connect-src directive to include your SignalR domain with both wss:// and https://.
ABP SignalR Integration
Ensure your SignalR hub is correctly configured in your ABP application and that the endpoint is mapped as shown in the official ABP documentation.
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<YourHub>("/signalr-hubs/instant-message");
});
And make sure your frontend connects to the correct URL.
References:
These steps will allow your SignalR service to work correctly behind Nginx with proper WebSocket and CSP configuration.
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.
Required Steps:
AbpBundlingOptions and add your contributors for LeptonX:[DependsOn(
typeof(AbpAspNetCoreMvcUiBundlingModule),
typeof(AbpAspNetCoreMvcUiLeptonXThemeBundlingModule)
)]
public class YourWebModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpBundlingOptions>(options =>
{
options.StyleBundles.Get(MvcLeptonXThemeBundles.Styles.Global)
.AddContributors(typeof(YourStyleBundleContributor));
options.ScriptBundles.Get(MvcLeptonXThemeBundles.Scripts.Global)
.AddContributors(typeof(YourScriptBundleContributor));
});
}
}
Use MapAbpStaticAssets:
Startup.cs or module initialization, replace app.UseStaticFiles() with app.MapAbpStaticAssets() to ensure virtual files (including LeptonX assets) are served correctly in .NET 9.Remove Old Bundling Artifacts:
global.js or global.css files from your wwwroot if they were previously generated.AbpCli:Bundle section from your appsettings.json.Ensure Correct NuGet Packages:
<PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX.Bundling" Version="9.0.0" />
Volo.Abp.AspNetCore.Mvc.UI.Bundling.Development Mode:
Check for Additional Module Bundling:
Summary:
You must migrate your bundling configuration to the new Global Assets system, update your module dependencies, and use MapAbpStaticAssets for static file serving. This ensures the latest LeptonX bundles are loaded in ABP 9, including in development mode.
Sources:
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.
The error you are encountering when running dotnet dev-certs https -v -ep C:\Program Files\dotnet\myapp\openiddict.pfx ... is due to a permissions issue: the workflow is trying to write the openiddict.pfx file into C:\Program Files\dotnet\myapp, which is a protected system directory on Windows runners and does not allow write access for non-admin processes.
The ABP documentation recommends using ${{env.DOTNET_ROOT}}/myapp/openiddict.pfx, but on Windows runners, $DOTNET_ROOT is typically C:\Program Files\dotnet, which is not writable.
To fix this, change the output path for your publish and certificate generation steps to a directory that is guaranteed to be writable, such as $(Build.ArtifactStagingDirectory) or a relative path like ./myapp.
How to fix:
- name: dotnet publish
run: dotnet publish -c Release -r win-x64 --self-contained false -o ./myapp
shell: pwsh
working-directory: ./src/ArmadaIO.Web
env:
ASPNETCORE_ENVIRONMENT: Production
- name: Generate openiddict.pfx
run: dotnet dev-certs https -v -ep ./myapp/openiddict.pfx -p c41eb3e7-8a8e-429f-9052-0850406f2f11
shell: pwsh
- name: Upload artifact for deployment job
uses: actions/upload-artifact@v4
with:
name: .net-app
path: ./myapp
Summary:
Sources:
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.
The error message:
More than one module matches. Use the '--skip-import' option to skip importing the component into the closest module or use the module option to specify a module.
indicates that the Angular schematics used by ABP Suite cannot determine which Angular module to import the generated component into, because multiple modules match the criteria.
.module.ts file where you want the generated component to be imported (e.g., app.module.ts or a feature module).--module option to specify the exact module file path. For example:--module=src/app/your-feature/your-feature.module.ts
--module option.Clean Up Duplicate Modules
Workaround: Use --skip-import
--skip-import option. You will then need to manually import the generated component into the desired module.Regenerate After Fix
This is a known issue with Angular schematics when multiple modules match. See the following for more details and workarounds:
By specifying the module explicitly or cleaning up your module structure, you should be able to resolve the error and generate Angular UI code from ABP Suite.
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.
ABP Suite currently supports code generation for the services of a microservice solution, but UI code generation is not supported yet. When using the microservice template, ABP Suite generates code only for the supported layers and does not recognize or generate code for a custom Domain Layer you add to your microservices. Customizing the code generation process to include your own Domain Layer is not supported out of the box in the current version.
You can generate code on the service layer, but if you require code generation for a custom Domain Layer, you will need to manually integrate or adapt the generated code to fit your architecture.
This scenario—automatic code generation into a custom Domain Layer in microservice solutions—is not currently supported by ABP Suite.
Sources:
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.
Based on your description and the official ABP documentation for React Native integration, here are the key points and steps to ensure successful authentication and token handling in a tiered ABP project with React Native:
Localhost vs Emulator IPs:
10.0.2.2 is used to access the host machine's localhost.Environment.ts must consistently use 10.0.2.2 and the correct ports.Redirect URI Consistency:
redirect_uri registered in your OpenIddict client configuration (in the database and appsettings) must exactly match the one used in your React Native app (exp://10.0.2.2:19000).localhost instead of 10.0.2.2) will cause the authentication to fail or not complete properly.OpenIddict HTTPS Restriction:
CORS and Allowed Redirects:
exp://10.0.2.2:19000, etc.) are included in your CORS and OpenIddict allowed redirect URIs.React Native App URL:
appUrl in your Environment.ts should match the redirect URI used in the OAuth flow.Token Handling in React Native:
Debugging Tips:
Common Pitfall:
Summary of what to check/fix:
10.0.2.2 and the correct port.10.0.2.2.For more details and troubleshooting, refer to the official documentation:
Sources:
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.
In ABP Suite, when you create a master-detail (master/child) relationship for MongoDB, the generated code currently mixes two approaches:
As of now, ABP Suite does not automatically synchronize or populate the internal child collection within the master entity when using the reference pattern. The infrastructure for both approaches is generated, but only the reference pattern (separate collection) is fully supported and functional.
To avoid confusion and potential data inconsistency, you should rely on the reference pattern: manage child entities via their own repository and collection, and do not use the ICollection<TChild> property on the master entity for MongoDB projects unless you plan to implement embedded documents yourself.
It is recommended to remove the ICollection<TChild> property from the master entity in your domain model for MongoDB projects, unless you specifically want to use embedded documents and handle all related logic manually.
The current behavior is a known limitation, and the recommended approach is to use only one pattern (reference) for MongoDB master-detail relationships in ABP Suite.
Sources:
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.
Volo.Abp.AbpInitializationException with the message "Unexpected end of expression" during the initialization of Volo.Abp.AuditLogging.AbpAuditLoggingApplicationModule after upgrading to ABP 9.3.1 is likely related to a breaking change or misconfiguration introduced in the upgrade.To resolve this:
Check the ABP 9.3 Migration Guide
Review the official migration guide for ABP 9.3, as there are breaking changes and required updates for some modules:
Audit Logging Module Configuration
If you have custom configuration for the Audit Logging module (e.g., in appsettings.json or via code), ensure that all expressions, especially those using ABP's expression syntax (like filtering or selectors), are complete and valid. An "Unexpected end of expression" usually means a configuration value is incomplete or malformed.
Check for Expression-Based Settings
Look for any settings like EntityHistory.Selectors, AuditLog.Selectors, or similar in your configuration files. Make sure all expressions are properly closed and syntactically correct.
Compare with a Fresh 9.3.1 Solution
Generate a new ABP 9.3.1 Blazor Server solution and compare the appsettings.json and module configuration with your project to spot any differences.
Review Recent Changes
If you have recently customized the Audit Logging module or related configuration, revert or comment out those changes to isolate the issue.
Consult the Audit Logging Module Docs
Review the latest documentation for the Audit Logging module to ensure your configuration matches the expected format:
If you identify a specific configuration or expression causing the issue, correct it to resolve the startup error.
Sources:
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.
To forward external provider claims (like national identity number, date of birth) into the JWT issued to the Angular client, without persisting them in the database, you need to inject these claims at the token creation stage. The recommended ABP approach is to use a custom IAbpClaimsPrincipalContributor or override the claims principal creation logic, but you must ensure these claims are available at the time the JWT is generated.
However, since the external cookie is not available in the Angular app (due to different domain/port), you should transfer the required claims from the external identity to the local identity during the external login callback (OnGetExternalLoginCallbackAsync in LoginModel). You can do this by:
Example (in LoginModel.OnGetExternalLoginCallbackAsync):
var externalLoginInfo = await SignInManager.GetExternalLoginInfoAsync();
var nationalId = externalLoginInfo.Principal.FindFirst("national_identity_number")?.Value;
// Store in a temp location (e.g., ClaimsPrincipal, session, or custom claim)
var claims = new List<Claim>();
if (!string.IsNullOrEmpty(nationalId))
{
claims.Add(new Claim("national_identity_number", nationalId));
}
// Pass these claims to the ClaimsPrincipal used for JWT generation
You must ensure these claims are added to the ClaimsPrincipal before the JWT is created. Do not persist them in the database if you want to avoid storage.
To distinguish between BankID and local login, add a custom claim (e.g., "auth_method": "bankid" or "local") to the ClaimsPrincipal during the login process. This can be done in the same place as above (external login callback or in a custom IAbpClaimsPrincipalContributor).
Example:
claims.Add(new Claim("auth_method", "bankid")); // or "local"
This claim will then be included in the JWT and available to your Angular app and API logic.
Key Points:
If you need to customize the OpenIddict token creation pipeline for more advanced scenarios, you can implement a custom grant type or event handler to inject claims at token issuance.
Sources:
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.