This error message is ABP’s concurrency exception (optimistic concurrency):
“The data you have submitted has already been changed by another user…”
In your scenario it happens because multiple upload requests are hitting the same “chat attachment aggregate / message state” very close to a delete operation, so the upload flow tries to update an entity row with an outdated concurrency stamp / row version.
When you upload the same images “at the same time” (parallel requests), you increase the chance that two uploads update the same DB row, so one succeeds and the other(s) fail with concurrency. Uploading one-by-one serializes the updates, so you don’t see the conflict.
Workaround / fix on your side (no framework modification): serialize uploads per chat message/conversation
POST /api/app/chat-attachment/upload.Server-side mitigation (if you can customize/override the Chat Attachment app service)
conversationId or messageId), so only one upload modifies that aggregate at a time.AbpDbConcurrencyException / DbUpdateConcurrencyException (reload state and retry a limited number of times). This is a common mitigation for optimistic concurrency when parallel writes are expected.About “no SignalR event for message deletion” If you need real-time deletion sync, the typical approach is to extend the module by publishing your own distributed/local event on delete and broadcasting via your own SignalR hub (or extending the existing hub if the module allows). There’s no verified official doc/source in the available context for a built-in “message deleted” SignalR event for the Chat module.
(No links provided because I couldn’t retrieve any official/verified document specific to api/app/chat-attachment/upload concurrency behavior from the available tools’ indexed 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.
AbpLocalizationOptions, orPUT /api/language-management/language-texts/{resourceName}/{cultureName}/{name}): it updates/overrides the value of an existing key. If the key doesn’t exist in the resource, the UI/API won’t treat it as something to create.What you can do from UI
en.json under the relevant resource name, or whichever base resource you use).If you truly need “create new key from UI”
Links (validated):
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.
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.
ListService.hookToQuery(...) runs its stream when you call listService.get(). So to refresh the table when an InputSignal changes, the ABP-side pattern is: keep your hookToQuery as-is, and trigger listService.get() from a signal effect() whenever the input changes.import { Component, DestroyRef, effect, inject, OnInit, input, untracked } from '@angular/core';
import { ListService, PagedResultDto } from '@abp/ng.core';
import { EagleDto, GetListEagleDto, EagleService } from '@proxy/eagles';
@Component({
// ...
})
export class EagleComponent implements OnInit {
eagleId = input.required<string>();
public readonly listService = inject(ListService<GetListEagleDto>);
private readonly eagleService = inject(EagleService);
eagles: PagedResultDto<EagleDto> | null = null;
ngOnInit(): void {
const req = (query) =>
this.eagleService.getList({
...query,
eagleId: this.eagleId(), // read signal here (fine)
});
this.listService.hookToQuery(req).subscribe(res => {
this.eagles = res;
});
// Re-run query whenever eagleId changes
effect(() => {
this.eagleId(); // track changes
untracked(() => this.listService.get()); // trigger refresh without tracking ListService internals
});
}
}
untracked prevents the effect from accidentally re-running due to anything listService.get() touches internally; the only dependency will be eagleId().query() method anymore unless you also want a manual refresh button.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.
Recommended upgrade path (9.3.x → latest) for ABP Microservice + Angular + separated Auth Server
Areas that commonly need attention in this kind of upgrade (microservices + Angular + separated Auth Server)
What to validate first in non-production (minimum “upgrade readiness” test plan)
Practical upgrade checklist (order of operations)
Best-practice alignment / “drift” review
Links (validated):
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 the microservice template, permission groups/permissions are written into the Administration Service database by the microservice itself when that microservice starts (via PermissionManagementOptions.SaveStaticPermissionsToDatabase, which is true by default). So if the new microservice runs in AKS but its permission definitions are not appearing in AbpPermissionGroups / AbpPermissions, it means that microservice did not successfully execute the “save static permissions to DB” step in AKS (even if it worked locally).
Separately: granting new permissions to the admin role is not done by every microservice. Only Administration Service seeds/grants newly discovered permissions to the admin role. So even after the permissions exist in AbpPermissions, you may still not see AbpPermissionGrants for admin until Administration Service runs/restarts.
Restart the new microservice pods (not only Administration)
Permission definitions are persisted on microservice startup. After deploying a new microservice or adding new permissions, you must restart that microservice so it re-registers permissions into the Administration DB.
Restart the Administration Service after the microservice has registered permissions
Administration seeds/grants the missing permissions to admin when it starts. So do a rollout restart of Administration after the new microservice has come up successfully.
Verify PermissionManagementOptions.SaveStaticPermissionsToDatabase is not disabled in AKS configuration
In Kubernetes, it’s common to have environment-specific appsettings.Production.json (or Helm values) that differ from local. Ensure you didn’t override this option (directly or indirectly) to false in AKS.
Check the new microservice logs in AKS during startup
If it cannot reach the Administration database (connection string / firewall / DNS / TLS), or if it crashes before initialization completes, permissions won’t be saved. This is the most common cause when “works on localhost but not in AKS”, especially since you’re using different DB servers.
(If you also don’t see the permissions in the UI) Clear the distributed cache used by AKS Even after the DB rows exist, permission definition data is cached. If AKS uses a different Redis instance than local, you must clear that Redis (or restart services) to invalidate cached permission definitions.
admin without relying on Administration restartAdd a data seeder in the relevant microservice and call IPermissionDataSeeder to grant permissions to admin (ABP’s docs mention this approach and Identity service uses it).
Source (validated):
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.
This error means ABP Suite/Studio runs a build before creating the EF Core migration, and your solution does not compile after the generated files were added. So the code is generated, but the migration step is skipped because dotnet build failed.
Fix it by building your solution and then adding the migration manually:
dotnet build
Fix whatever compile error appears (most commonly: missing using/namespace, duplicate class name, broken partial class, package restore issues, etc.).
*.EntityFrameworkCore project (or the project that contains your DbContext), then run:dotnet ef migrations add Added_<YourEntityName> --context <YourDbContextName>
dotnet ef database update --context <YourDbContextName>
Links:
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.
Keep the “Partner” notion: ABP Suite/Studio can work with non-default navigation names (like Pilot.Partner pointing to Customer) because the navigation property form/metadata is not limited to EntityName-based naming. Your JSON snippet shows you already configured a custom navigation name (ReferencePropertyName: "Partner" etc.), and that’s a valid approach.
How you likely got into this mess (what’s happening)
When you click Save and generate again, ABP Suite/Studio re-generates multiple code artifacts based on the entity definition + navigation definition. In some versions/flows, Suite/Studio may fall back to convention-based naming (using the target entity name like Customer) in some generated DTOs / “WithNavigationProperties” models and UI pieces, even if your FK/name is customized. This kind of mismatch has been reported historically as a Suite inconsistency around naming navigation properties (especially in “WithNavigationProperties” / DTO generation), and it matches your symptoms: your FK/name stays as you intended in one place, but regenerated classes/pages revert to using the referenced entity’s name (Customer) elsewhere.
A related, older report exists here (not your exact “Partner becomes Customer everywhere”, but the same category: Suite not consistently honoring the specified navigation property name in generated navigation DTOs): https://abp.io/support/questions/3291
Why it “spreads” into child entities / breaks the solution
Once Suite/Studio generates mismatched names (e.g., Customer in some places and Partner in others), subsequent runs can treat the project’s current code as input signals (assemblies scanned, existing DTOs/classes found), and the next regeneration can propagate the convention name further—resulting in a cascade of incorrect renames and compilation errors.
What you can do today to avoid repeated cleanup (practical mitigation)
Partner (not auto-filled back to Customer) right before you click generate.When will it be fixed? I can’t give you a definitive “fixed in version X” for this exact Partner→Customer regression because I don’t have a verified release note or ticket reference that explicitly matches your scenario. The closest verified/public evidence I can point to is that Suite has had known issues around navigation naming consistency (see the support ticket above), and that naming behavior has been actively improved across versions (see the migration guide note above).
Sources (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.
HasColumnType("decimal(18,6)") / HasPrecision(18, 6) and create a follow-up migration) is expected with the current Suite generation capabilities.IEntityTypeConfiguration<TEntity> (or ABP-style model builder extension) for each entity (or a base convention) and set precision/scale there.HasPrecision(precision, scale) (provider-agnostic) or HasColumnType(...) if you must target a specific DB (e.g., SQL Server).No verified ABP documentation/support entry was found that states Suite supports decimal precision/scale configuration in the entity property editor, or that there is a global Suite setting for it.
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
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.