Root cause: In ABP v10 projects generated by ABP Suite, Mapperly generates a mapper class like CompanyWithNavigationPropertiesToCompanyWithNavigationPropertiesDtoMapper.g.cs. The NullReferenceException typically occurs when a navigation collection or reference (e.g., Sectors, Child collection, or a WithNavigationProperties reference) is null and the generated MapToListOf... or MapTo... method doesn’t guard against null. This happens if the repository/service returns entities without including related data or returns null collections, and the generated mapper directly enumerates them.
Fix it at the query layer (recommended): Ensure navigation properties and collections are loaded (Include / ThenInclude) before mapping. In the repository GetListWithNavigationPropertiesAsync (or the query used by your AppService), include the related entities/collections and coalesce collections to empty lists where needed.
Example:
public async Task<List<CompanyWithNavigationProperties>> GetListWithNavigationPropertiesAsync(
string filterText, string sorting, int maxResultCount, int skipCount, CancellationToken cancellationToken = default)
{
var query = (await GetQueryableAsync())
.Include(x => x.Organisation) // reference
.Include(x => x.Sectors) // collection
.AsSplitQuery(); // optional for safety
// apply filters, sorting, paging...
var items = await query
.OrderBy(string.IsNullOrWhiteSpace(sorting) ? nameof(Company.Name) : sorting)
.Skip(skipCount)
.Take(maxResultCount)
.ToListAsync(GetCancellationToken(cancellationToken));
// Optional: defensive normalization so Mapperly doesn't hit null collections
foreach (var item in items)
{
item.Sectors ??= new List<Sector>();
}
return items.Select(e => new CompanyWithNavigationProperties
{
Company = e,
Organisation = e.Organisation,
Sectors = e.Sectors
}).ToList();
}
return new CompanyWithNavigationProperties
{
Company = company,
Organisation = company.Organisation,
Sectors = company.Sectors ?? new List<Sector>()
};
// In Application project (not in obj folder)
public partial class CompanyWithNavigationPropertiesToCompanyWithNavigationPropertiesDtoMapper
{
private ICollection<Sector> Safe(ICollection<Sector>? source) => source ?? Array.Empty<Sector>();
// If your generated method is MapToListOfSectorDto, add a partial wrapper where you call it with Safe(...)
public CompanyWithNavigationPropertiesDto MapSafe(CompanyWithNavigationProperties source)
{
// normalize before calling generated Map(...)
source.Sectors ??= new List<Sector>();
return Map(source); // calls the generated method
}
}
Then use ObjectMapper.Map with the safe entry point (or normalize source prior to mapping). Prefer fixing data loading as shown above.
[DependsOn(typeof(AbpDddApplicationModule), typeof(AbpAutoMapperModule), typeof(AbpMapperlyModule))]
public class YourApplicationModule : AbpModule
{
}
This guarantees ABP’s MapperlyAutoObjectMappingProvider is active.
public override async Task<PagedResultDto<CompanyWithNavigationPropertiesDto>> GetListAsync(GetCompaniesInput input)
{
var items = await _companyRepository.GetListWithNavigationPropertiesAsync(
input.FilterText, input.Sorting, input.MaxResultCount, input.SkipCount);
// items must have non-null navigation collections
var dtos = ObjectMapper.Map<List<CompanyWithNavigationProperties>, List<CompanyWithNavigationPropertiesDto>>(items);
var totalCount = await _companyRepository.GetCountAsync(input.FilterText /* ... */);
return new PagedResultDto<CompanyWithNavigationPropertiesDto>(totalCount, dtos);
}
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 means the configured languages contain an invalid LanguageInfo (missing CultureName/UiCultureName/DisplayName) at runtime. In containers, this typically happens because environment variables are not bound correctly to options (wrong keys, wrong indices, or YAML parsing removing quotes).
Do the following:
Ensure RequestLocalization is consistent
Map environment variables correctly in docker-compose
Remove or fix commented examples in docker-compose
Verify runtime configuration
Seed Language Management (if Dynamic Localization enabled)
Clear caches and restart containers
Why this fixes the error LanguageInfo.ChangeCultureInternal throws when any LanguageInfo has null/empty CultureName. In your log, the crash happens while building the language switch model. When configuration binding yields a LanguageInfo with missing CultureName (often due to malformed environment variable keys or YAML parsing), the theme tries to use it and the exception is thrown, returning HTTP 500 on /Account/Login.
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.
using Medallion.Threading;
using Medallion.Threading.Redis;
using StackExchange.Redis;
context.Services.AddSingleton<IDistributedLockProvider>(sp =>
{
var configuration = context.Services.GetConfiguration();
var mux = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]); // e.g., "127.0.0.1"
return new RedisDistributedSynchronizationProvider(mux.GetDatabase());
});
- Ensure all instances share the same distributed lock backend.
Configure<AbpDistributedEventBusOptions>(options =>
{
options.Outboxes.Configure(config => { config.UseDbContext<MyDbContext>(); });
options.Inboxes.Configure(config => { config.UseDbContext<MyDbContext>(); });
});
- Outbox/Inbox tables must live in the same database as your business data to execute in a single transaction.
On duplicates and ordering
If you need higher parallelism
Not supported/out-of-scope
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.
Prerequisites
Command abp suite generate -e <entity-json-path> -s <solution-sln-path> [options]
Required parameters
Common options
Typical usage examples
Basic generation (single module, single UI) abp suite generate -e C:\Users<you>.suite\entities\Country.json -s C:\dev\MyApp\MyApp.sln
Generate only for Angular UI abp suite generate -e ..suite\entities\Product.json -s .\MyApp.sln --ui angular
Overwrite previously generated files (refresh after entity changes) abp suite generate -e ..suite\entities\Order.json -s .\MyApp.sln --overwrite true
Dry run to preview changes abp suite generate -e ..suite\entities\Customer.json -s .\MyApp.sln --dry-run true
Generate into a specific module in a modular solution abp suite generate -e ..suite\entities\Invoice.json -s .\MyMicroserviceApp.sln --module AccountingService
What the command does
Authoring the entity JSON A minimal example to get started (Country.json): { "name": "Country", "namespace": "MyCompany.MyApp", "tableName": "AppCountries", "primaryKey": "Guid", "aggregateRoot": true, "audited": true, "fields": [ { "name": "Name", "type": "string", "maxLength": 128, "required": true }, { "name": "Code", "type": "string", "maxLength": 8, "required": true, "unique": true } ], "ui": { "create": { "visible": true }, "edit": { "visible": true }, "delete": { "visible": true }, "list": { "columns": [ { "name": "Name", "width": 200 }, { "name": "Code", "width": 120 } ] } }, "permissions": { "groupName": "Country", "default": "MyApp.Countries", "create": "MyApp.Countries.Create", "update": "MyApp.Countries.Update", "delete": "MyApp.Countries.Delete" } }
Recommended workflow
Troubleshooting tips
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 ABP Identity’s default behavior, but stop emitting all roles for every user. ABP doesn’t need role claims in the cookie to authorize permissions; it evaluates permissions server-side. So, minimize role claims while preserving Identity/permission functionality.
Option A (recommended): Do not add any role claims at sign-in; rely on ABP permission system
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Security.Claims;
public class RemoveBulkRoleClaimsContributor : IAbpClaimsPrincipalContributor, ITransientDependency
{
public Task ContributeAsync(AbpClaimsPrincipalContributorContext context)
{
var identity = context.ClaimsPrincipal.Identities.FirstOrDefault();
if (identity == null) return Task.CompletedTask;
// Remove pre-added role claims to reduce cookie size
var roleClaims = identity.FindAll(AbpClaimTypes.Role).ToList();
foreach (var c in roleClaims)
{
identity.TryRemoveClaim(c);
}
// Optionally add only a marker claim (tiny) if your app needs to know user has roles
// identity.AddClaim(new Claim("has_roles", "true"));
return Task.CompletedTask;
}
}
using Volo.Abp.Modularity;
using Volo.Abp.Security.Claims;
public class YourAuthServerModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpClaimsPrincipalFactoryOptions>(options =>
{
options.Contributors.Add<RemoveBulkRoleClaimsContributor>();
});
}
}
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Identity;
using Volo.Abp.Security.Claims;
using Volo.Abp.Users;
public class UserOnlyRolesClaimsContributor : IAbpClaimsPrincipalContributor, ITransientDependency
{
public async Task ContributeAsync(AbpClaimsPrincipalContributorContext context)
{
var identity = context.ClaimsPrincipal.Identities.FirstOrDefault();
if (identity == null) return;
// Remove any pre-added Role claims first
var existingRoleClaims = identity.FindAll(AbpClaimTypes.Role).ToList();
foreach (var c in existingRoleClaims)
{
identity.TryRemoveClaim(c);
}
var userId = identity.FindUserId();
if (!userId.HasValue) return;
var userRoleFinder = context.ServiceProvider.GetRequiredService<IIdentityUserRoleFinder>();
var roleRepository = context.ServiceProvider.GetRequiredService<IIdentityRoleRepository>();
var roleIds = await userRoleFinder.GetRoleIdsAsync(userId.Value);
if (!roleIds.Any()) return;
var roles = await roleRepository.GetListAsync(roleIds);
foreach (var role in roles)
{
identity.AddClaim(new Claim(AbpClaimTypes.Role, role.Name));
}
}
}
Register similarly via AbpClaimsPrincipalFactoryOptions.
Option C (compact roles into a single small claim)
If you use OpenIddict/JWT for SPA:
General tips to avoid “request header too long”:
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.
Root cause: You are issuing too many claims into the authentication ticket (cookie). In ABP/ASP.NET Core Identity, role claims are added by the claims principal factory. You can fully control which role claims are emitted and reduce cookie size by customizing ABP’s claims principal pipeline.
Recommended approach: Implement an IAbpClaimsPrincipalContributor that only adds the roles for the current user (and optionally, compresses or limits them) and removes any global/bulk role claims. Register it in your HttpApi.Host/AuthServer.
Example: Only include roles assigned to the current user and limit count
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Security.Claims;
using Volo.Abp.Users;
using Volo.Abp.Identity;
using Volo.Abp;
public class MinimalRolesClaimsContributor : IAbpClaimsPrincipalContributor, ITransientDependency
{
// Adjust as needed
private const int MaxRolesToInclude = 20;
public async Task ContributeAsync(AbpClaimsPrincipalContributorContext context)
{
var identity = context.ClaimsPrincipal.Identities.FirstOrDefault();
if (identity == null)
{
return;
}
// 1) Remove any pre-added Role claims to avoid duplication or global roles
var existingRoleClaims = identity.FindAll(AbpClaimTypes.Role).ToList();
foreach (var c in existingRoleClaims)
{
identity.TryRemoveClaim(c);
}
// 2) Add only current user's roles (optionally limit the count)
var userId = identity.FindUserId();
if (!userId.HasValue)
{
return;
}
var userRoleFinder = context.ServiceProvider.GetRequiredService<IIdentityUserRoleFinder>();
var roleRepository = context.ServiceProvider.GetRequiredService<IIdentityRoleRepository>();
// Get role IDs for the user
var roleIds = await userRoleFinder.GetRoleIdsAsync(userId.Value);
// Load roles and order deterministically
var roles = await roleRepository.GetListAsync(roleIds);
var roleNames = roles
.Select(r => r.Name)
.OrderBy(n => n)
.Take(MaxRolesToInclude)
.ToList();
foreach (var roleName in roleNames)
{
identity.AddClaim(new Claim(AbpClaimTypes.Role, roleName));
}
// Optional: If you want to avoid multiple Role claims, you can add a single compact claim:
// identity.AddClaim(new Claim("roles_csv", string.Join(",", roleNames)));
// Then, customize your authorization policy provider to read from this single claim instead of multiple Role claims.
}
}
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Modularity;
using Volo.Abp.Security.Claims;
[DependsOn(typeof(AbpIdentityHttpApiModule))] // or your relevant modules
public class YourHostModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpClaimsPrincipalFactoryOptions>(options =>
{
// Add our contributor at the end (or earlier if you want to override earlier contributors)
options.Contributors.Add<MinimalRolesClaimsContributor>();
});
}
}
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.
Steps:
// app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
// LeptonX modules you will need in the template
import { LpxTopMenuLayoutModule, LpxSideMenuLayoutModule } from '@volosoft/ngx-lepton-x/layouts';
import {
LpxNavbarModule,
LpxBrandLogoModule,
LpxTopbarModule,
LpxTopbarContentModule,
LpxToolbarContainerModule,
LpxAvatarModule,
LpxSettingsModule,
LpxBreadcrumbModule,
LpxFooterModule
} from '@volosoft/ngx-lepton-x/components';
import { LpxResponsiveModule } from '@volo/ngx-lepton-x.core';
import { AppCustomTopLayoutComponent } from './layouts/app-custom-top-layout.component';
@NgModule({
declarations: [AppCustomTopLayoutComponent],
imports: [
BrowserModule,
// Import the LeptonX modules (pick what you actually use)
LpxTopMenuLayoutModule,
LpxSideMenuLayoutModule,
LpxNavbarModule,
LpxBrandLogoModule,
LpxTopbarModule,
LpxTopbarContentModule,
LpxToolbarContainerModule,
LpxAvatarModule,
LpxSettingsModule,
LpxBreadcrumbModule,
LpxFooterModule,
LpxResponsiveModule
],
bootstrap: [/* ... */]
})
export class AppModule {}
<!-- app-custom-top-layout.component.html -->
<div id="lpx-wrapper">
<div class="lpx-content-container">
<div class="lpx-topbar-container">
<div class="lpx-topbar">
<!-- Left: Logo -->
<div class="lpx-header-top">
<lpx-brand-logo></lpx-brand-logo>
</div>
<!-- Center: Routes (Top Menu Navbar) -->
<div class="lpx-top-menu-navbar">
<lpx-navbar></lpx-navbar>
</div>
<!-- Right: User/Settings toolbar -->
<div class="lpx-right-menu">
<lpx-toolbar-container></lpx-toolbar-container>
<lpx-avatar></lpx-avatar>
<lpx-settings></lpx-settings>
</div>
</div>
</div>
<!-- Optional: Breadcrumb under header -->
<div class="lpx-breadcrumb-container">
<lpx-breadcrumb></lpx-breadcrumb>
</div>
<!-- Page content -->
<div class="lpx-content-wrapper">
<div class="lpx-content">
<router-outlet></router-outlet>
</div>
</div>
<div class="lpx-footbar-container">
<lpx-footer></lpx-footer>
</div>
</div>
<!-- Mobile navbar if needed -->
<lpx-mobile-navbar *lpxResponsive="'all md-none'"></lpx-mobile-navbar>
</div>
Example (replace main layout globally):
// app-routing.module.ts (example)
const routes: Routes = [
{
path: '',
component: AppCustomTopLayoutComponent,
children: [
// your app routes here
],
},
];
Notes:
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.
Verify Redis health and networking
Increase StackExchange.Redis timeouts conservatively
Use ABP’s Redis integration package and set a key prefix
Consider lowering load from Application Configuration
Prevent cache operations from being cancelled by request aborts
Check thread pool starvation and blocking code
Use connection multiplexing correctly across tiered services
As a last resort, raise the retry budget and use resilient Redis
Example minimal configuration in WebModule: [DependsOn(typeof(AbpCachingStackExchangeRedisModule))] public class MyWebModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { Configure<AbpDistributedCacheOptions>(options => { options.KeyPrefix = "MyApp:"; options.GlobalCacheEntryOptions.SlidingExpiration = TimeSpan.FromMinutes(10); }); } }
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.
Short answer: Yes. Starting from ABP v8.3, you can switch ABP’s EF Core global filters (ISoftDelete, IMultiTenant, etc.) to a user-defined-function (UDF) mapping approach that removes the “(@__ef_filter__p_X = 1 OR …)” pattern and generates index-friendly predicates. You can also selectively disable filters per scope/query when needed.
Steps (apply in your DbContext):
protected override bool ShouldFilterEntity<TEntity>(IMutableEntityType entityType)
{
if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)) ||
typeof(IMultiTenant).IsAssignableFrom(typeof(TEntity)))
{
return true;
}
return base.ShouldFilterEntity<TEntity>(entityType);
}
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Microsoft.EntityFrameworkCore.Query.SqlExpressions;
using System.Linq.Expressions;
using Volo.Abp.Data;
using Volo.Abp.Domain.Entities;
using Volo.Abp.MultiTenancy;
using Volo.Abp.EntityFrameworkCore;
public class MyProjectDbContext : AbpDbContext<MyProjectDbContext>
{
protected bool SoftDeleteEnabled => DataFilter?.IsEnabled<ISoftDelete>() ?? false;
protected bool MultiTenantEnabled => DataFilter?.IsEnabled<IMultiTenant>() ?? false;
public MyProjectDbContext(DbContextOptions<MyProjectDbContext> options)
: base(options)
{ }
protected override Expression<Func<TEntity, bool>> CreateFilterExpression<TEntity>(ModelBuilder modelBuilder)
{
var expression = base.CreateFilterExpression<TEntity>(modelBuilder);
// ISoftDelete
if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)))
{
Expression<Func<TEntity, bool>> softDeleteFilter = e => !SoftDeleteEnabled || !EF.Property<bool>(e, "IsDeleted");
if (UseDbFunction())
{
softDeleteFilter = e => SoftDeleteUdf(((ISoftDelete)e).IsDeleted, true);
var current = this.GetService<AbpEfCoreCurrentDbContext>();
modelBuilder.HasDbFunction(typeof(MyProjectDbContext).GetMethod(nameof(SoftDeleteUdf))!)
.HasTranslation(args =>
{
var isDeleted = args[0];
var boolParam = args[1];
if (current.Context?.DataFilter.IsEnabled<ISoftDelete>() == true)
{
// IsDeleted = 0
return new SqlBinaryExpression(
ExpressionType.Equal,
isDeleted,
new SqlConstantExpression(Expression.Constant(false), boolParam.TypeMapping),
boolParam.Type,
boolParam.TypeMapping);
}
// no WHERE fragment when disabled
return new SqlConstantExpression(Expression.Constant(true), boolParam.TypeMapping);
});
}
expression = expression == null
? softDeleteFilter
: QueryFilterExpressionHelper.CombineExpressions(expression, softDeleteFilter);
}
// IMultiTenant
if (typeof(IMultiTenant).IsAssignableFrom(typeof(TEntity)))
{
Expression<Func<TEntity, bool>> tenantFilter = e =>
!MultiTenantEnabled || EF.Property<Guid?>(e, "TenantId") == CurrentTenant.Id;
if (UseDbFunction())
{
tenantFilter = e => TenantUdf(((IMultiTenant)e).TenantId, CurrentTenant.Id);
var current = this.GetService<AbpEfCoreCurrentDbContext>();
modelBuilder.HasDbFunction(typeof(MyProjectDbContext).GetMethod(nameof(TenantUdf))!)
.HasTranslation(args =>
{
var entityTenantId = args[0];
var currentTenantId = args[1];
if (current.Context?.DataFilter.IsEnabled<IMultiTenant>() == true)
{
// TenantId = @CurrentTenantId
return new SqlBinaryExpression(
ExpressionType.Equal,
entityTenantId,
currentTenantId,
entityTenantId.Type,
((SqlExpression)entityTenantId).TypeMapping);
}
return new SqlConstantExpression(Expression.Constant(true), ((SqlExpression)entityTenantId).TypeMapping);
});
}
expression = expression == null
? tenantFilter
: QueryFilterExpressionHelper.CombineExpressions(expression, tenantFilter);
}
return expression;
}
public static bool SoftDeleteUdf(bool isDeleted, bool _)
=> throw new NotSupportedException(AbpEfCoreDataFilterDbFunctionMethods.NotSupportedExceptionMessage);
public static bool TenantUdf(Guid? tenantId, Guid? currentTenantId)
=> throw new NotSupportedException(AbpEfCoreDataFilterDbFunctionMethods.NotSupportedExceptionMessage);
public override string GetCompiledQueryCacheKey()
{
return $"{base.GetCompiledQueryCacheKey()}:{SoftDeleteEnabled}:{MultiTenantEnabled}:{CurrentTenant.Id}";
}
private static bool UseDbFunction() => true; // keep as feature flag if you need
}
Resulting SQL examples:
When filters enabled:
When disabled: no WHERE fragment is emitted for that filter. This removes the “(@__ef_filter__p_X = 1 OR …)” form and allows index seeks on IsDeleted/TenantId aligned indexes.
Disabling or customizing filters per scope/query:
using (DataFilter.Disable<ISoftDelete>())
{
// query without soft-delete
}
using (DataFilter.Disable<IMultiTenant>())
{
// query without tenant constraint
}
var q = (await _repo.GetQueryableAsync())
.IgnoreQueryFilters(); // if you really need to bypass everything
Indexing tips:
Notes:
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, reliable ways:
A) Use a design-time factory (most reliable)
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
using System.IO;
using Volo.Abp.AuditLogging.EntityFrameworkCore;
public class AbpAuditLoggingDbContextFactory
: IDesignTimeDbContextFactory<AbpAuditLoggingDbContext>
{
public AbpAuditLoggingDbContext CreateDbContext(string[] args)
{
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true)
.AddJsonFile("appsettings.Development.json", optional: true)
.AddEnvironmentVariables()
.Build();
var cs = configuration.GetConnectionString("AbpAuditLogging")
?? configuration.GetConnectionString("Default");
var builder = new DbContextOptionsBuilder<AbpAuditLoggingDbContext>()
.UseSqlServer(cs);
return new AbpAuditLoggingDbContext(builder.Options);
}
}
dotnet ef migrations add Init_Audit_Logging \
--context Volo.Abp.AuditLogging.EntityFrameworkCore.AbpAuditLoggingDbContext
B) Use your host as startup project
dotnet ef migrations add Init_Audit_Logging \
--project path/to/YourApp.EntityFrameworkCore \
--startup-project path/to/YourApp.HttpApi.Host \
--context Volo.Abp.AuditLogging.EntityFrameworkCore.AbpAuditLoggingDbContext
Requirements:
Configure<AbpDbContextOptions>(opts =>
{
opts.UseSqlServer();
opts.Configure<Volo.Abp.AuditLogging.EntityFrameworkCore.AbpAuditLoggingDbContext>(c => c.UseSqlServer());
});
Why you only saw the __EFMigrationsHistory table
After migrations exist
dotnet run --project src/YourApp.DbMigrator
Quick checklist
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.