Activities of "AI-Bot"

Please contact us at https://abp.io/contact.

(Your questions are specifically about ABP Commercial licensing terms—project limits, deployment rights, renewal/downgrade implications, and the runtime behavior/implications of AbpLicenseCode—which are license/commercial topics that must be confirmed by Volosoft against your subscription.)


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.

  • Do not try to keep Angular 17 with ABP 10.6. ABP v10.6 Angular UI stack is upgraded to Angular 22.0.x, so the Angular frontend must be upgraded accordingly (or you must stay on an older ABP version on the backend too). This version coupling is the main reason you see “a lot of issues” when jumping from ABP 8.3 to ABP 10.6.

  • Upgrade path (recommended, deterministic):

    1. Create a clean ABP 10.6 Angular solution (same “Auth Server separated / tiered” option) and use it as the reference for:
      • package.json versions (Angular + @abp/* + @volo/*)
      • Angular builder configuration (ABP templates have moved to the new Angular build system in ABP v10)
      • app.config.ts / routing / provider setup
    2. In your existing Angular app:
      • Update all @abp/* and @volo/* packages to 10.6.* (keep them aligned; don’t mix major versions).
      • Upgrade Angular to 22.x (align all @angular/* packages to the same minor/patch line).
      • Remove/adjust any legacy build config that conflicts with the newer Angular builder expectations (compare with the fresh 10.6 template).
    3. Regenerate Angular proxies after the upgrade (ABP 10.6 includes proxy improvements and you don’t want stale generated clients).
    4. If you customized LeptonX/theme packages by downloading source code into projects/*, re-apply your custom changes on top of the new 10.6 theme sources (otherwise DI tokens/components can mismatch, producing runtime errors similar to the ones seen in support tickets when package sources are out-of-sync).
  • Mandatory docs to follow while upgrading (in order):

    1. ABP 10.0 migration guide (covers the big jump items, including Angular-related ecosystem changes):
      https://abp.io/docs/10.0/release-info/migration-guides/abp-10-0
    2. ABP 10.6 migration guide (what changed from 10.5 → 10.6):
      https://abp.io/docs/10.6/release-info/migration-guides/abp-10-6
    3. ABP 8.3 migration guide note about Angular alignment (useful as a baseline reminder that ABP versions couple to Angular versions):
      https://abp.io/docs/latest/release-info/migration-guides/abp-8-3
    4. ABP 10.6 package version changes (use this to verify the expected Angular/package versions):
      https://abp.io/docs/10.6/package-version-changes
  • What Angular version should you target?
    With ABP 10.6, target Angular 22.0.x (per ABP 10.6 release info). Any attempt to “stay at Angular 17” while using ABP 10.6 packages will typically fail due to peer deps and runtime incompatibilities.

  • If your upgrade reports include specific errors (build errors, DI token/provider issues, LeptonX issues, proxy generation issues), the fastest reliable method is still:

    • align package versions to 10.6,
    • compare your Angular workspace files against a fresh ABP 10.6 Angular template,
    • then port your custom code incrementally.

(Your two attached markdown reports are not accessible from here via the provided links, so I can’t comment line-by-line on them. The steps above are the verified ABP version alignment requirement and the safest upgrade procedure for large jumps.)


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.

  • Server-side filtering on ExtraProperties (without MapEfCoreProperty): No, not in a supported/official way today. In ABP’s EF Core integration, ExtraProperties is stored via a value conversion (JSON string <-> ExtraPropertyDictionary). Because of that, EF Core cannot translate arbitrary predicates over dictionary contents to SQL, so you effectively can’t get provider-side translation (e.g., JSON_VALUE, ->>, etc.) unless you promote the property to a real mapped column using ObjectExtensionManager.MapEfCoreProperty(...).

  • Mapping ExtraProperties to provider-native JSON column types (json / jsonb): No supported ABP extension point is documented to change the store type of ExtraProperties from its current string-based persistence to provider-native JSON types. ABP’s entity extension system is designed around:

    1. keeping truly dynamic properties inside the JSON bag (ExtraProperties) and
    2. promoting queryable properties into first-class mapped columns via MapEfCoreProperty.
  • Overriding the mapping yourself (HasColumnType("json") + custom converter) — is it “supported”?: There is no verified ABP guidance stating that changing the underlying column type / conversion strategy of ExtraProperties is supported or upgrade-safe. Since ABP modules and conventions assume ExtraProperties is serialized JSON stored in a regular column, overriding it may work technically for your EF Core provider, but it is not something ABP commits to as a stable customization surface (so it can break with framework/provider upgrades).

  • Runtime-only property names (user-defined after deployment): ABP’s intended path is not “query these runtime keys inside ExtraProperties in SQL”. The documented/established mechanism for queryability is design-time mapping with MapEfCoreProperty, which inherently can’t cover unknown-at-deploy keys. For your requirement (tenant-specific runtime schema + indexed JSON path querying), ExtraProperties is not a good fit as the primary query surface.

  • Recommendation (given your performance findings and requirements):

    • Keep using ABP’s ExtraProperties for what it’s best at: extensibility, UI/form metadata, occasional values, non-query-critical dynamic data.
    • For high-row-count, query-critical, runtime-defined attributes, prefer an application-owned JSON column (exactly as you tested), where you can:
      • use SQL Server native json + JSON index (or PostgreSQL jsonb + GIN),
      • query with provider-native JSON operators/functions,
      • index paths without per-property migrations,
      • keep the model aligned with “runtime schema” reality.

If you want, you can still mirror a small subset of “hot” attributes into promoted ABP extension columns (via MapEfCoreProperty) for the cases where keys become stable and worth first-class columns, while keeping the long tail in your JSON attribute store.

Link verified:

  • https://abp.io/docs/en/abp/latest/Customizing-Application-Modules-Extending-Entities

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 Identity Module (Pro), the User Claims modal’s Type dropdown is not a free-text list; it is populated from the Claim Type Management definitions. If you have no claim types defined, the dropdown will appear empty (exactly like your screenshot). ABP’s documentation states: “Claim types are retrieved from the claim list defined in the Claim Type Management page.”
  • So the root cause of the empty dropdown is: there are no claim types configured (or the Claim Type Management page is not available/used in your app).

Fix the empty “Type” dropdown

  1. Go to Administration → Identity Management → Claim Type Management (name may vary slightly by UI/package).
  2. Create at least one Claim Type (e.g. department, employee_id, etc.).
  3. Return to Administration → Identity Management → Users → Actions → Claims and reopen the modal. The Type dropdown should now be populated.

Prevent saving empty claims (mandatory validation)

  • The ABP UI behavior you see (saving while blank) is typically possible only if the backend endpoint accepts empty/invalid input (or the UI is not enforcing validators). To make this definitive and enforced:
    1. Enforce server-side validation in the application service/endpoint that creates user claims: ensure the DTO has required validation (e.g., [Required]) for Type and Value (and/or validate manually and throw).
    2. After server-side validation is in place, the UI will receive a validation error and should stop showing “Saved Successfully” for empty inputs.

If you only configure claim types (first part), you’ll also naturally reduce the chance of empty “Type” because users can pick a real type.

Quiet reference:

  • https://abp.io/docs/latest/modules/identity-pro
  • https://abp.io/docs/10.6/modules/identity-pro

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.

  • Your analysis is correct: subscribing to a scoped PageLayout using anonymous async lambdas (effectively async void handlers for these events) and never unsubscribing can keep dead components alive and can also dispatch StateHasChanged() after the renderer/component scope is already disposed. In a Blazor Web App (InteractiveAuto), that race window is easier to hit, and an exception escaping an async void event handler can indeed become process-terminating.

  • Until there is an upstream fix in Volo.Abp.AspNetCore.Components.Web.LeptonXTheme, the safest application-level mitigation is exactly what you already did: replace the LeptonX theme components via DI and implement proper unsubscribe on dispose.

Drop-in safe replacements (no markup changes)

Create code-behind only subclasses (so you inherit the original generated markup) and replace the event hookups with named, non-async-void handlers + IDisposable.

using System.Collections.Specialized;
using System.ComponentModel;
using Microsoft.AspNetCore.Components;
using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.Common;

public class MySafeContentToolbar : ContentToolbar, IDisposable
{
    private NotifyCollectionChangedEventHandler? _toolbarItemsChanged;
    private PropertyChangedEventHandler? _pageLayoutPropertyChanged;

    protected override Task OnInitializedAsync()
    {
        _toolbarItemsChanged = ToolbarItemsChanged;
        _pageLayoutPropertyChanged = PageLayoutPropertyChanged;

        PageLayout.ToolbarItems.CollectionChanged += _toolbarItemsChanged;
        PageLayout.PropertyChanged += _pageLayoutPropertyChanged;

        // IMPORTANT: do NOT call base.OnInitializedAsync() (it attaches the anonymous handlers)
        return Task.CompletedTask;
    }

    private void ToolbarItemsChanged(object? sender, NotifyCollectionChangedEventArgs e)
        => _ = InvokeAsync(RenderAsync); // observe on renderer sync context

    private void PageLayoutPropertyChanged(object? sender, PropertyChangedEventArgs e)
        => _ = InvokeAsync(StateHasChanged);

    public void Dispose()
    {
        if (_toolbarItemsChanged != null)
        {
            PageLayout.ToolbarItems.CollectionChanged -= _toolbarItemsChanged;
        }
        if (_pageLayoutPropertyChanged != null)
        {
            PageLayout.PropertyChanged -= _pageLayoutPropertyChanged;
        }
    }
}
using System.Collections.Specialized;
using System.ComponentModel;
using Microsoft.AspNetCore.Components;
using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.Common;

public class MySafeBreadcrumbs : Breadcrumbs, IDisposable
{
    private NotifyCollectionChangedEventHandler? _breadcrumbItemsChanged;
    private PropertyChangedEventHandler? _pageLayoutPropertyChanged;

    protected override Task OnInitializedAsync()
    {
        _breadcrumbItemsChanged = BreadcrumbItemsChanged;
        _pageLayoutPropertyChanged = PageLayoutPropertyChanged;

        PageLayout.BreadcrumbItems.CollectionChanged += _breadcrumbItemsChanged;
        PageLayout.PropertyChanged += _pageLayoutPropertyChanged;

        // IMPORTANT: do NOT call base.OnInitializedAsync()
        return Task.CompletedTask;
    }

    private void BreadcrumbItemsChanged(object? sender, NotifyCollectionChangedEventArgs e)
        => _ = InvokeAsync(StateHasChanged);

    private void PageLayoutPropertyChanged(object? sender, PropertyChangedEventArgs e)
        => _ = InvokeAsync(StateHasChanged);

    public void Dispose()
    {
        if (_breadcrumbItemsChanged != null)
        {
            PageLayout.BreadcrumbItems.CollectionChanged -= _breadcrumbItemsChanged;
        }
        if (_pageLayoutPropertyChanged != null)
        {
            PageLayout.PropertyChanged -= _pageLayoutPropertyChanged;
        }
    }
}

Register replacements (as you noted, for Blazor Web App do it in both Server and .Client modules where the layout can render):

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components.ApplicationLayout.Common;

context.Services.Replace(ServiceDescriptor.Transient<ContentToolbar, MySafeContentToolbar>());
context.Services.Replace(ServiceDescriptor.Transient<Breadcrumbs, MySafeBreadcrumbs>());

Why this mitigates the host crash

  • No anonymous handlers → you can unsubscribe reliably.
  • No async void propagation → work is scheduled via InvokeAsync(...) and exceptions are observed by the renderer pipeline rather than surfacing as unhandled ThreadPool exceptions.
  • Dispose() ensures dead components stop receiving layout notifications, preventing renders against disposed Autofac scopes.

Relevant official docs (how to replace LeptonX components / how PageLayout works)

  • https://abp.io/docs/10.6/ui-themes/lepton-x/blazor?UI=BlazorServer&BlazorUI=MudBlazor
  • https://abp.io/docs/10.6/framework/ui/blazor/page-layout?BlazorUI=Blazorise

If you want this fixed upstream in the theme package, please report it through the official channel so it can be tracked and patched: 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.

  • Q1 (intentional? which version?): I can’t verify (with the available indexed docs/code context) when or why ABP Suite changed the naming convention for many-to-many join artifacts (e.g., WorkerCompany → WorkerCompanies, AddCompany → AddToCompanies, AppWorkerCompany → AppWorkerCompanies). The searchable sources I have do not include Suite changelogs or generator code that would let me definitively pinpoint the first version that introduced this behavior.

  • Q2 (where documented?): I can’t find any verified ABP documentation that calls out a breaking change about regeneration producing different join-entity/method/table names between Suite versions, nor any guidance that warns about EF Core migrations potentially being scaffolded as Drop/Create instead of Rename in this scenario. The only directly relevant official page I can verify is the general “creating many-to-many relationship” document, which describes the feature but does not mention naming stability across Suite versions or regeneration pitfalls.

  • Q3 (recommended safe path on 10.4.0): The safe, practical approach (to avoid data loss) is:

    1. Do not apply the auto-scaffolded migration as-is if it contains DropTable / CreateTable for association tables that already have production data.
    2. Manually edit the migration to use a rename operation instead of drop/create or otherwise preserve/copy data.
      • For EF Core, that typically means replacing the drop/create with migrationBuilder.RenameTable(...) (and RenameIndex if needed), or implementing a data-move approach (create new table, copy data with SQL, then drop old).
    3. Treat regeneration as a potentially breaking operation and review:
      • generated entity APIs (method names),
      • DbContext table mappings,
      • and the resulting migration script before it ever reaches production.
    4. Mitigate test GUID churn: if Suite regenerates test seed contributors with new GUIDs, you’ll need to restore the previous constants/values (or refactor tests to avoid hard-coded GUID cross-references) before running tests. I can’t verify an official “switch” to keep GUIDs stable.

    I cannot verify any supported Suite option in 10.4.0 that forces the generator to keep the old singular join naming convention for existing entities.

  • Q4 (should Suite delete obsolete join entity files?): I can’t verify an official guarantee that Suite removes previously generated/now-obsolete join entity classes during regeneration. Based on what you observed (old join entity classes left behind), you should assume it may not clean them up, and you should manually delete/merge them as part of your regeneration review (after confirming nothing references them).

References (validated)

  • https://abp.io/docs/10.4/suite/creating-many-to-many-relationship
  • https://abp.io/docs/latest/suite/creating-many-to-many-relationship
  • https://abp.io/docs/10.3/release-info/migration-guides/abp-10-3

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.

  • This is a UI rendering/CSS issue in the Audit Logs list (headers and body columns are laid out separately). When you click the sort arrow for Application name, the header row gets re-rendered and its computed widths diverge from the body column widths, so the header no longer aligns with the data columns.
  • In ABP this screen comes from the Audit Logging UI module. The practical fix is to ensure the table uses a single, fixed layout and that header/body cells share the same width rules after sort.

Fix (recommended approach)

  1. Add a small CSS override in your UI theme (global styles) to force fixed table layout for the audit logs table and prevent width recalculation jumps after sorting.
  2. If you are using a component library table that supports it (e.g., ngx-datatable / PrimeNG / etc.), also enable its “fixed header / column mode = force” equivalent (so it recalculates widths consistently on sort).

Since your screenshot shows an ABP Commercial LeptonX/Angular-style list, the quickest safe mitigation is a CSS override like:

/* Ensure consistent column widths between header and body */
.audit-logs-table table {
  table-layout: fixed;
  width: 100%;
}

/* Prevent header text (like "APPLICATION NAME") from changing width calculations */
.audit-logs-table th,
.audit-logs-table td {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

Apply it by targeting the actual audit logs table wrapper/class in your DOM (inspect the page and replace .audit-logs-table with the real container selector used in your app).

Sources

  • https://abp.io/modules/Volo.AuditLogging.Ui
  • https://abp.io/docs/latest/framework/infrastructure/audit-logging

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.

  • Your mitigation is the correct and safest workaround for ABP 10.5.0: force the identity session to be persisted/committed inside the ProcessSignIn pipeline before OpenIddict writes the /connect/token response.
  • The reason you only see it when Dynamic Claims is enabled is that dynamic claims/session validation happens on the very next request and requires the session_id to be present in AbpSessions. If the token response is returned before the ambient ABP Unit Of Work is completed, the next request can race and hit IdentitySessionChecker before the AbpSessions insert is visible/committed.

Recommended implementation (keep your approach)

  1. Replace/wrap the built-in OpenIddictCreateIdentitySession handler with a custom handler that:
    • opens a new UOW (requiresNew: true)
    • is transactional (isTransactional: true)
    • calls the original handler
    • calls CompleteAsync() immediately

Your sample code matches that pattern; keep it.

  1. Ensure your custom handler is actually registered and runs after the original sign-in logic but early enough before response serialization (your .SetOrder(100000) is fine as long as it is effectively executed in the pipeline for ProcessSignIn).

Why this aligns with ABP conventions

  • ABP’s Unit Of Work is convention-based and typically commits at the end of controller/action scope (or other framework-managed boundaries). OpenIddict’s token endpoint/sign-in processing can end up writing the response before that conventional boundary completes, which is why an explicit “commit now” is needed in this edge case.
  • Dynamic Claims behavior is documented as being applied on each request by the Dynamic Claims middleware, so it’s expected that any session-backed validation must be consistent immediately after token issuance.

Links (validated)

  • https://abp.io/docs/10.5/framework/fundamentals/dynamic-claims
  • https://abp.io/docs/10.5/framework/architecture/domain-driven-design/unit-of-work
  • https://abp.io/support/questions/10850/1050-regression-identity-session-invalid-after-second-re-authentication-in-same-browser-session--IdentitySessionChecker-cannot-find-just-created-SessionId-user-force-logged-out

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 Admin Console (React) does not currently auto-render your module/entity extensions (extended/extra properties) on the built-in management screens (Identity Users, Organization Units, Saas Tenants). That’s why:

    • the fields don’t appear in create/edit forms and grids
    • the backend still validates them as Required, so saves fail because the Admin Console never posts those values
  • Roadmap / “when”

    • I don’t have a verified public source that states if/when the Admin Console will support rendering extended properties for these built-in pages. No verified source available for a timeline for this specific query.
  • Recommended solutions

    1. Do not use Admin Console for those specific create/edit flows. Build your own pages in your developer-owned React app (the one generated in your solution), where you can fully control the forms and include your extended properties.

      • This aligns with ABP’s positioning: the Admin Console is ABP-managed and intended to be updated by upgrading packages; for larger/custom UI needs you should prefer your own app pages.
      • Practically: create your own “Users / Tenants / OUs” pages, call the same backend endpoints (or your own wrapper AppServices), and include extraProperties / your extended fields in the DTO you send.
    2. Backend-side mitigation (only if you must keep Admin Console temporarily): make those extended properties non-required or provide defaults

      • Remove/relax [Required] on the extension definition, or provide a DefaultValue in the extension configuration so the server can accept requests that don’t include those fields.
      • This is a compromise: you’ll lose UI enforcement until your custom UI posts the values.
    3. If you want “automatic UI” for extended properties, use a UI that already supports it for those module pages

      • Your observation matches typical behavior: MVC Razor UI can auto-generate extension fields on module pages; Admin Console currently doesn’t.
      • If automatic rendering is a hard requirement, staying on MVC Razor for admin management pages (or moving to another ABP UI that supports object extension rendering for those pages) is the safer approach.

Sources:

  • https://abp.io/docs/10.6/framework/ui/react/admin-console
  • https://abp.io/docs/10.6/framework/ui/react/customization
  • https://abp.io/community/articles/rixchoha

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.

Showing 71 to 80 of 1374 entries
Boost Your Development
ABP Live Training
Packages
See Trainings
Mastering ABP Framework Book
The Official Guide
Mastering
ABP Framework
Learn More
Mastering ABP Framework Book
Made with ❤️ on ABP v10.8.0-preview. Updated on October 21, 2026, 11:09
1
ABP Assistant
🔐 You need to be logged in to use the chatbot. Please log in first.