ABP Suite/Studio does not support UI code generation for the microservice template (Angular UI). In microservice solutions, Suite can generate code on the services, but UI code generation is not supported. If you are trying to generate the Angular UI together with the entity, the generation can fail during the process (often surfacing around migration/object-mapping steps).
If the failure is happening at the migration step, apply migrations manually instead of relying on Suite’s “add migration / update database” step:
*.EntityFrameworkCore project for the service, run EF Core migrations manually:dotnet ef migrations add Added_MyEntity --context <YourDbContextName>
dotnet ef database update --context <YourDbContextName>
Links (verified):
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.
Delete endpoint). To run your own logic safely when a user is deleted from that UI, ABP’s recommended approach is to replace/override the Identity module’s user AppService and add your logic around the base DeleteAsync call (before/after the soft-delete happens).IdentityUser is updated/soft-deleted) and then null out your foreign keys in an event handler.DeleteAsync(Guid id) and:
Employee.ManagerId = null for all employees referencing that user (before or after calling base.DeleteAsync(id); usually before is safest if your domain logic expects the manager to exist while you update employees).base.DeleteAsync(id) to keep the standard ABP behavior (permissions, checks, etc.).Skeleton (structure to follow; the key is ReplaceServices + ExposeServices):
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Identity;
[Dependency(ReplaceServices = true)]
[ExposeServices(typeof(IIdentityUserAppService))]
public class MyIdentityUserAppService : IdentityUserAppService
{
private readonly IEmployeeRepository _employeeRepository;
public MyIdentityUserAppService(
IIdentityUserRepository userRepository,
IdentityUserManager userManager,
IEmployeeRepository employeeRepository
/* plus the other deps required by base ctor in your version */
)
: base(userRepository, userManager /* ... */)
{
_employeeRepository = employeeRepository;
}
public override async Task DeleteAsync(Guid id)
{
// 1) Null out references
await _employeeRepository.SetManagerToNullAsync(id);
// 2) Proceed with the default ABP deletion (soft delete)
await base.DeleteAsync(id);
}
}
Implement the repo method efficiently (example idea):
SetManagerToNullAsync(Guid userId) does a bulk update (preferred) or loads + updates employees.This ensures every delete from the ABP UI (since it calls IIdentityUserAppService.DeleteAsync) goes through your custom logic.
Instead of overriding the app service, you can subscribe to a user deletion/soft-delete event and update Employee.ManagerId there. This keeps your customization independent from the UI and from which app service triggers the delete.
If you go this route, the key is: soft delete is an update on IdentityUser, so you need an event that runs when the user is soft-deleted and then execute your nulling logic.
(No verified, version-specific official sample for “IdentityUser soft-deleted → null FKs” was found in the available context/code search, but this aligns with ABP’s general event-driven extension approach.)
https://abp.io/docs/latest/framework/fundamentals/dependency-injection
https://abp.io/docs/latest/framework/infrastructure/event-bus
https://abp.io/docs/latest/modules/identity
https://abp.io/docs/latest/framework/architecture/modularity/basics
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.
OnDelete(DeleteBehavior.SetNull) is an EF Core / database-level delete behavior. It is applied when the principal row is physically deleted (hard delete) and the database (or EF Core cascade pipeline) executes the configured referential action.IdentityUser row; it only sets IsDeleted = true (and audit fields). Therefore, no database delete happens, so DeleteBehavior.SetNull is never triggered.DeleteBehavior.SetNull for soft-deletes, because the FK nulling is tied to actual DELETE operations, not to an UPDATE that marks IsDeleted.What to do instead (pick one):
Keep the FK as-is and treat “soft-deleted user” as logically missing
Employee.Manager (your IdentityUser navigation), ABP’s ISoftDelete filter will hide soft-deleted users by default, so the navigation will typically come back as null in queries that apply filters (even though ManagerId still has a value).Manually set ManagerId = null when the manager user is soft-deleted (recommended if you truly need FK-null semantics)
Employee.ManagerId = null).If you really want SetNull to happen automatically, you must hard-delete the user
ON DELETE SET NULL in the database.HardDeleteAsync (where applicable). Be careful: hard-deleting identity users may have broader implications.Notes about your mapping
builder.HasOne(p => p.IdentityUser)
.WithMany()
.HasForeignKey(x => x.ManagerId)
.OnDelete(DeleteBehavior.SetNull);
It just won’t run on soft delete, because soft delete is an UPDATE, not a DELETE.
Links (verified)
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.
Please contact us at https://abp.io/contact.
The https://nuget.abp.io/<your-feed> endpoints are customer/license-specific feeds. A 404 / Not Found typically indicates one of these is true:
Provide your feed URL (mask the secret parts), and we can verify the correct endpoint and authentication method on your account via the contact channel above.
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.
Please contact us at https://abp.io/contact and include:
If the report contains sensitive details, mention that in the message so the team can follow up with a secure channel for sharing attachments/logs.
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.
redirect_uri sent in the OIDC request must exactly match one of the redirect URIs registered for the Azure AD app.tenant1.app.mydomain.com), Azure AD will see a different redirect_uri than app.mydomain.com and reject it unless it is registered.What you can do (ABP-supported approach): use wildcard subdomain support on the ABP/OpenIddict side (for ABP’s own AuthServer/OpenIddict validations), but note it does NOT remove Azure AD’s redirect URI requirement.
https://app.mydomain.com/signin-oidc (or whatever your callback path is)This keeps Azure AD redirect URIs fixed and avoids registering per-tenant subdomains.
invalid redirect_uri there (not Azure)If the invalid redirect_uri is coming from ABP’s OpenIddict/AuthServer (common in multi-tenant domain setups), enable ABP’s wildcard-domain support so ABP accepts tenant subdomains without seeding each one:
In your AuthServer module PreConfigureServices:
using Volo.Abp.OpenIddict.WildcardDomains;
public override void PreConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
PreConfigure<AbpOpenIddictWildcardDomainOptions>(options =>
{
options.EnableWildcardDomainSupport = true;
options.WildcardDomainsFormat.Add("https://{0}.app.mydomain.com");
// add other app formats if needed
});
}
And configure tenant domain resolving:
using Volo.Abp.MultiTenancy;
Configure<AbpTenantResolveOptions>(options =>
{
options.AddDomainTenantResolver("{0}.app.mydomain.com");
});
This prevents having to seed redirect URIs per-tenant for ABP/OpenIddict.
However, again: Azure AD still requires exact redirect URIs (so Option B alone won’t solve the Azure AD registration limitation).
Links (verified):
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.EventBus.Azure / AbpEventBusAzureModule, those events are no longer “in-memory”; they are sent to Azure Service Bus.Enable Outbox/Inbox for transactional reliability (recommended)
Do not rely on distributed event handlers for “must-run-now” seeding logic
IDistributedEventHandler<>.If only one app should use Azure Service Bus, disable it in the others
IsServiceBusDisabled = true): https://abp.io/support/questions/6222This 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.
Product and later an Order is added/updated/removed, the cached Product entry is not automatically refreshed just because a related entity changed. You should assume the cached Product may have a stale navigation collection (e.g., Product.Orders) until the Product cache entry is explicitly invalidated or the Product itself is updated/deleted.Product entity cache for the navigation list; instead query Orders separately (or implement your own invalidation strategy when Order changes, e.g., publish an event and remove the related Product cache entry).(verified) https://abp.io/docs/latest/framework/infrastructure/entity-cache
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.
/api/abp/application-configuration) are being redirected to the login page (302) because the Angular app state/config is still the “anonymous” one at that moment. A hard refresh fixes it because the app boots from scratch and fetches configuration again with a valid session/token, so you then get 200 and data.import { ConfigStateService } from '@abp/ng.core';
import { firstValueFrom } from 'rxjs';
// call this after login succeeds (after redirect callback is processed)
await firstValueFrom(this.configStateService.refreshAppState());
this.routesService.refresh();
window.location.reload();
(This works because it forces ABP Angular to re-bootstrap and re-fetch /api/abp/application-configuration with an authenticated context.)
/api/abp/application-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.
A 302 after login in ABP UI typically means the browser is being redirected to the login page again for the first API calls (most commonly /api/abp/application-configuration). The UI then boots in an “anonymous/no data” state. After a hard refresh, the authentication state is established and the same requests return 200, so data appears.
In a single-layer (monolith) Web + API setup, the most common reason is that the UI makes API calls before the authenticated application state is refreshed (or the token/cookie is not considered valid for that first round-trip), so the first config/data call gets redirected (302), resulting in an empty page.
Fix (Angular UI / SPA scenario)
import { ConfigStateService } from '@abp/ng.core';
import { firstValueFrom } from 'rxjs';
// after login success
await firstValueFrom(this.configStateService.refreshAppState());
this.routesService.refresh();
window.location.reload();
Fix (MVC/Razor Pages UI scenario)
/api/abp/application-configuration (or your page’s first API call) is getting a 302 to /Account/Login. The fix is to ensure authentication is fully established before making those AJAX calls (or avoid rendering the page until configuration is loaded). If you’ve customized login behavior, revert to the standard ABP login flow or ensure the returnUrl/redirect completes normally.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.