Hello,
I created folders for AbpAccount and AbpIdentiy under Localizations within the Domain.Shared project.
Domain.Shared/Localizations/AbpAccount/en.json
{ "Culture": "en", "Texts": { "DisplayName:Name": "First name", "DisplayName:Surname": "Last name" } }Domain.Shared/Localizations/AbpIdentity/en.json
{ "Culture": "en", "Texts": { "DisplayName:Name": "First name", "DisplayName:Surname": "Last name", "Name": "First name", "Surname": "Last name" } }I modified the DomainSharedModule's ConfigureServices as follows:
Configure<AbpLocalizationOptions>(options => { ... options.Resources .Get<IdentityResource>() .AddVirtualJson("/Localization/AbpIdentity"); ... });I modified the ApplicationContractModule's ConfigurationServices as follows:
Configure<AbpLocalizationOptions>(options => { options.Resources .Get<AccountResource>() .AddVirtualJson("/Localization/AbpAccount"); });
It seems that you did everything right. By any chance, can you share your project via email, so I can better assist you? (support@abp.io with the ticket number)
Hi, you should download the source-code, make the customizations and then recompile to CSS for overriding/or using another font:
To download the source-code, you can use the following command:
abp get-source Volo.Abp.LeptonXTheme
Then, please follow the documentation: https://abp.io/docs/latest/ui-themes/lepton-x/source-files
You can also check this thread if you want.
Hi, we will check this problem and write you back asap. Thanks for your understanding.
Hi, can it be related to https://abp.io/support/questions/4596/Email-Parameter-pasword-set-to-NULL#answer-3a09b39b-df3d-fdcb-f5ee-8e1adf660f20 can you please check? You may have different DefaultPassPhrase for two projects.
And also please check that can you see the password in the database.
Hi, we are using Bootstrap for our tag helpers, and abp-tab is no exception. You should be able to hide tabs with both display:none; and visibility: hidden;. Please share more information if the following info doesn't help you.
You can hide the first tab as follows for an example on the js side:
$("ul#PermissionsTabs > li:first").hide();
//or for completely hiding all the tabs
$("ul#PermissionsTabs").hide();
If you want to do this on the CSS side, then you can do the following:
ul #PermissionsTabs
{
visibility: hidden !important; //or alternatively -> display: none !important;
}
Hi, yes you are right, there is a missing "steps" keyword before the invalid line. Here is the correct one:
# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy
# More GitHub Actions for Azure: https://github.com/Azure/actions
name: Build and deploy ASP.Net Core with BlazorServer to Azure Web App
on:
push:
branches:
- main
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up .NET Core
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.x'
include-prerelease: true
- name: Install ABP CLI
run: |
dotnet tool install -g Volo.Abp.Cli
abp install-libs
shell: bash
- name: Build with dotnet
run: dotnet build --configuration Release
- name: Run migrations
run: dotnet run -- "${{ secrets.CONNECTION_STRING }}" # Set your connection string as a secret in your repository settings
working-directory: ./src/blazorservertierdemo.DbMigrator # Replace with your project name
- name: dotnet publish apihost
run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/apihost
working-directory: ./src/blazorservertierdemo.HttpApi.Host # Replace with your project name
- name: Generate authserver.pfx
run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/apihost/authserver.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password
- name: dotnet publish webapp
run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/webapp
working-directory: ./src/blazorservertierdemo.Blazor # Replace with your project name
- name: Upload artifact for apihost
uses: actions/upload-artifact@v4
with:
name: .net-apihost
path: ${{env.DOTNET_ROOT}}/apihost
- name: Upload artifact for webapp
uses: actions/upload-artifact@v4
with:
name: .net-webapp
path: ${{env.DOTNET_ROOT}}/webapp
deploy:
runs-on: ubuntu-latest
needs: build
environment:
name: 'Production'
url: ${{ steps.deploy-to-webapp-3.outputs.webapp-url }}
steps:
- name: Download artifact from apihost
uses: actions/download-artifact@v4
with:
name: .net-apihost
path: ./apihost
- name: Deploy apihost
id: deploy-to-webapp-2
uses: azure/webapps-deploy@v3
with:
app-name: 'apihost-blazorserver' # Replace with your app name
slot-name: 'Production'
publish-profile: ${{ secrets.apihostblazorserverPublishSettings }} # Set your Azure Web App to publish your profile as a secret in your repository settings
package: ./apihost
- name: Download artifact from webapp
uses: actions/download-artifact@v4
with:
name: .net-webapp
path: ./webapp
- name: Deploy webapp
id: deploy-to-webapp-3
uses: azure/webapps-deploy@v3
with:
app-name: 'webapp-blazorserver' # Replace with your app name
slot-name: 'Production'
publish-profile: ${{ secrets.webappblazorserverPublishSettings }} # Set your Azure Web App to publish your profile as a secret in your repository settings
package: ./webapp
Anyway, I just thought I'd let someone know. Also, may want to update the dot-net version since version 9 is out now.
I have created an issue for that: https://github.com/abpframework/abp/issues/22061
I noticed that when I click on the Download Publish Profile, mine does not download and says "Basic Authentication is Disabled". Is this supposed to be like that?
Yes, it's disabled by default, if you want to enable it, please refer to the answer below:
https://learn.microsoft.com/en-us/answers/questions/1497453/how-to-download-publish-profile
Hi, to add more than 10 custom-code placeholders, you should edit templates and add the relevant placeholder for the related templates. Here are the documents that you can check to see how to do that:
We are using Pomelo.EntityFrameworkCore.MySql NuGet package in our MySQL provider package, which is Volo.Abp.EntityFrameworkCore.MySQL. This package hasn't released a stable version for .NET 9 yet.
Therefore, the provider is unable to transform/process some SQL queries, we are closely following the stable 9.0.0 release of the Pomelo.EntityFrameworkCore.MySql package and we will update our provider when they release the stable version. (You can also follow the upgrade status from https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql/issues/1841, if you want)
When using EF Core 9 with MySQL in ABP-based projects, you may encounter SQL translation issues. One of the key problems is that certain queries involving parameterized collections fail to translate correctly.
To fix this problem, you can open your module class of the *.EntityFrameworkCore project and configure the AbpDbContextOptions as follows:
//...
public class MyProjectEntityFrameworkCoreModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
//...
Configure<AbpDbContextOptions>(options =>
{
options.UseMySQL(builder =>
{
//add the following line 👇
builder.TranslateParameterizedCollectionsToConstants();
});
});
}
}
Using the TranslateParameterizedCollectionsToConstants() option ensures that parameterized collections are translated into constants, preventing SQL translation errors.
Can you provide me the docs related to this default behaviour of EF Core?
Sure. Here are two documentation that you can refer:
Regards.
Hi @EngincanV,
I have created a 3rd example app, of the User & UserProfile example inside an ABP framework solution: https://cdn.fuzed.app/share/abp/AbpEFCorePlayground.zip
This time the SQL query loop occurs again, within ABP framework, using the same configuration as previous example. So I think this is some framework issue that needs to be fixed.
User entity:
using System; using Volo.Abp.Domain.Entities.Auditing; namespace AbpEFCorePlayground.Users; public class User : FullAuditedAggregateRoot<Guid> { public User( Guid id, string name) { Id = id; Name = name; } private User() { } public string Name { get; set; } public UserProfile? Profile { get; set; } }UserProfile entity:
using System; using Volo.Abp.Domain.Entities.Auditing; namespace AbpEFCorePlayground.Users; public class UserProfile : FullAuditedEntity<Guid> { public Guid Id { get; set; } public string Bio { get; set; } public Guid UserId { get; set; } public User User { get; set; } }UsersDataSeedContributor:
using System; using System.Threading.Tasks; using Volo.Abp.Data; using Volo.Abp.DependencyInjection; using Volo.Abp.Uow; namespace AbpEFCorePlayground.Users; public class UsersDataSeedContributor : IDataSeedContributor, ITransientDependency { private readonly IUserRepository _userRepository; public UsersDataSeedContributor(IUserRepository userRepository) { _userRepository = userRepository; } [UnitOfWork] public virtual async Task SeedAsync(DataSeedContext context) { User user = new User( id: Guid.Parse("c64b873e-c067-43e0-ae00-07992a880837"), name: "Steff Beckers") { Profile = new UserProfile() { Bio = "Software Developer" } }; await _userRepository.DeleteAsync(x => x.Id == user.Id); await _userRepository.InsertAsync(user); } }EF entity configuration:
builder.Entity<User>(b => { b.ToTable(AbpEFCorePlaygroundConsts.DbTablePrefix + "Users", AbpEFCorePlaygroundConsts.DbSchema); b.ConfigureByConvention(); //auto configure for the base class props b.HasOne(x => x.Profile) .WithOne(x => x.User) .HasForeignKey<UserProfile>(x => x.UserId) .IsRequired() .OnDelete(DeleteBehavior.Cascade); }); builder.Entity<UserProfile>(b => { b.ToTable(AbpEFCorePlaygroundConsts.DbTablePrefix + "UserProfiles", AbpEFCorePlaygroundConsts.DbSchema); b.ConfigureByConvention(); //auto configure for the base class props }); Configure<AbpEntityOptions>(options => { options.Entity<User>(e => { e.DefaultWithDetailsFunc = query => query.Include(x => x.Profile); }); });App service:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AbpEFCorePlayground.Users; public class UsersAppService : AbpEFCorePlaygroundAppService, IUsersAppService { private readonly IUserRepository _userRepository; public UsersAppService(IUserRepository userRepository) { this._userRepository = userRepository; } public async Task DeleteUserProfileAsync() { var user = await _userRepository.GetAsync(x => x.Id == Guid.Parse("c64b873e-c067-43e0-ae00-07992a880837")); user.Profile = null; await _userRepository.UpdateAsync(user); } }Best regards, Steff Beckers
The problem is that you are setting the UserId as not nullable in the UserProfile, and this restricts you to set the user.Profile as null. This is default behaviour of EF Core. There is no problem in the ABP Framework side.You can try the same in a plain asp.net core application.
Also, the cascade-delete does not apply in the update scenarios. For example, if you delete the related user, the relevant profile will also be deleted, because of the cascade-delete option. However, setting a user's profile as null is not related to that. To be able to set it null, you should make it as optional. And if you want to ensure, setting it null also should delete the dependent 1-1 entity you should update your code according to that.