I have a requirement to resolve each tenant by a custom URL. I followed the blog post here https://blog.antosubash.com/posts/abp-extend-tenant-with-custom-host to add a custom field to y tenant table called "Host". When a user navigates to my solution on the URL, it will resolve the tenant automatically. I had a solution based on v4.4 which worked perfectly using this approach as documented in the blog. I upgraded the solution to v6 and the error being returned now is
Translation of 'EF.Property(EntityShaperExpression: Volo.Saas.Tenants.Tenant ValueBufferExpression: ProjectionBindingExpression: EmptyProjectionMember IsNullable: False , "Host")' failed. Either the query source is not an entity type, or the specified property does not exist on the entity type.
I then created a brand new v6.0.0 ABP solution and followed the blog thinking that I perhaps broke something in the upgrade. Unfortunately, it displays the same error.
The code fails as it is unable to find the new custom field added to the entity.
Thats for the speedy reply. The answer to both your questions is yes. The *ModelSnapshot.cs class has the Host column specified on the Volo.Saas.Tenants.Tenant entity and the physical database column has the extra column.
This is the content of the DbContext.cs class
` namespace TaxDep.EntityFrameworkCore;
[ReplaceDbContext(typeof(IIdentityProDbContext))] [ReplaceDbContext(typeof(ISaasDbContext))] [ConnectionStringName("Default")] public class TaxDepDbContext : AbpDbContext
#region Entities from the modules
/* Notice: We only implemented IIdentityProDbContext and ISaasDbContext
* and replaced them for this DbContext. This allows you to perform JOIN
* queries for the entities of these modules over the repositories easily. You
* typically don't need that for other modules. But, if you need, you can
* implement the DbContext interface of the needed module and use ReplaceDbContext
* attribute just like IIdentityProDbContext and ISaasDbContext.
*
* More info: Replacing a DbContext of a module ensures that the related module
* uses this DbContext on runtime. Otherwise, it will use its own DbContext class.
*/
// Identity
public DbSet<IdentityUser> Users { get; set; }
public DbSet<IdentityRole> Roles { get; set; }
public DbSet<IdentityClaimType> ClaimTypes { get; set; }
public DbSet<OrganizationUnit> OrganizationUnits { get; set; }
public DbSet<IdentitySecurityLog> SecurityLogs { get; set; }
public DbSet<IdentityLinkUser> LinkUsers { get; set; }
// SaaS
public DbSet<Tenant> Tenants { get; set; }
public DbSet<Edition> Editions { get; set; }
public DbSet<TenantConnectionString> TenantConnectionStrings { get; set; }
#endregion
public TaxDepDbContext(DbContextOptions<TaxDepDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
/* Include modules to your migration db context */
builder.ConfigurePermissionManagement();
builder.ConfigureSettingManagement();
builder.ConfigureBackgroundJobs();
builder.ConfigureAuditLogging();
builder.ConfigureIdentityPro();
builder.ConfigureOpenIddict();
builder.ConfigureFeatureManagement();
builder.ConfigureLanguageManagement();
builder.ConfigureSaas();
builder.ConfigureTextTemplateManagement();
builder.ConfigureBlobStoring();
builder.ConfigureGdpr();
/* Configure your own tables/entities inside here */
//builder.Entity<YourEntity>(b =>
//{
// b.ToTable(TaxDepConsts.DbTablePrefix + "YourEntities", TaxDepConsts.DbSchema);
// b.ConfigureByConvention(); //auto configure for the base class props
// //...
//});
builder.ConfigurePayment();
}
}
` As per the documentation, here is the setup of the *ExtensionMappings.cs
As per the documentation, here is the content of the *ExtensionConfigurator.cs class (inside Domain.Shared)
As mentioned, this worked as is in a previous version of ABP. I realise an easy workaround would be the adjust the TenantRepository to use a stored procedure instead, although it would be great to not have to create a workaround.
Where can I upload the source to? I can send the entire application.
I have pushed the repo to a public repository. It can be found here:
https://github.com/ImranHugo/abp-entity-sample.git
Thanks for the feedback. Looking forward to the patch.
Our solution uses Azure AD for user authentication and is using the following code:
`
AddOpenIdConnect("AzureOpenId", "SSO", options =>
{
options.Authority = $"{configuration["AzureAd:Instance"]}{configuration["AzureAd:TenantId"]}/v2.0/";
options.ClientId = configuration["AzureAd:ClientId"];
options.ResponseType = OpenIdConnectResponseType.CodeIdToken;
options.CallbackPath = configuration["AzureAd:CallbackPath"];
options.ClientSecret = configuration["AzureAd:ClientSecret"];
options.RequireHttpsMetadata = false;
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.Scope.Add("email");
options.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "sub");
});
When this process registers the user, I would like to fill in the rest of the AbpUsers details (Firstname, Lastname etc). Do I need to override the ExternalUserRegistration code or can it be achieved through configuration of the scopes?
Hi ABP Team,
I'm working on a solution that uses multiple DbContexts to isolate certain functional domains into separate databases. For example:
This setup allows us to decouple cross-cutting concerns, so other solutions can integrate with ReferenceData without needing to access or be aware of core ABP tables like identity, audit logs, etc. It also simplifies permissions, as we don’t want to manage fine-grained access to specific tables—we prefer to isolate at the database level.
Following the ABP documentation, I’ve:
The ReferenceData database is created and operational.
However, when I open ABP Suite to create a new entity, **there is no option to select which DbContext **the entity should be added to. It appears to default to the main AppDbContext, which is not what I want in this case.
My goal: I’d like to generate new entities using ABP Suite and have them scaffolded against the appropriate DbContext (e.g., ReferenceDataDbContext) instead of always defaulting to the main one.
Questions:
Thanks in advance for your guidance!