I want to force the user UI to be in Thai language. So, I set cultureinfo using this code.
``` C#
var cultureInfo = CultureInfo.GetCultureInfo("th-TH");
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
I also tried app.UseRequestLocalization and added only "th-TH" supported.
It's working fine on windows. But not in linux. I have tried running on asp.net core running docker image from mcr.microsoft.com. Still, it didn't work. I also tried on CentOS within and outside the container. It produces the same issue.
After adding this code, on Windows, the date time is rendered in Thai format properly. When running kestrel on linux and the query with parameter (Where clause) is specified in LINQ, it throws an exception.
PostgresException: 42703: column "__normalizedusername_0" does not exist
### Steps to reproduce
Add this code.
``` C#
var cultureInfo = CultureInfo.GetCultureInfo("th-TH");
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
and try running
``` C#
await _userManager.FindByNameAsync(username_to_test);
Output on /Identity/Account/Login
Npgsql.NpgsqlConnector+<>c__DisplayClass160_0+<
Npgsql.NpgsqlConnector+<>c__DisplayClass160_0+<
Npgsql.NpgsqlDataReader.NextResult(bool async, bool isConsuming)
Npgsql.NpgsqlCommand.ExecuteReaderAsync(CommandBehavior behavior, bool async, CancellationToken cancellationToken)
Npgsql.NpgsqlCommand.ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken)
Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
Microsoft.EntityFrameworkCore.Query.RelationalShapedQueryCompilingExpressionVisitor+AsyncQueryingEnumerable
System.Runtime.CompilerServices.ValueTaskAwaiter
Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleOrDefaultAsync
Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleOrDefaultAsync
Microsoft.AspNetCore.Identity.UserManager
Microsoft.AspNetCore.Identity.SignInManager
eSignatureWebApp.Areas.Identity.Pages.Account.LoginModel.OnPostAsync(string returnUrl) in Login.cshtml.cs
```
EF Core version: 3.0.0
Database provider: Npgsql 4.1.1 and Npgsql.EntityframeworkCore.Postgresql 3.0.1
Target framework: .net core 3.0
Operating system: CentOS 7 within container, CentOS 7, container mcr.microsoft.com/dotnet/core/aspnet:3.0
IDE: Visual Studio 2019
@roji Any thoughts here? Could this be a Linux config issue?
@utarn could you please submit a minimal project triggering the issue?
@roji I'm trying to create a new simple project but still not able to reproduce the issue. Please wait.
Now I'm have managed to reproduce the error. I put it here. https://github.com/utarn/testculture. Also the docker-compose file I use to test.
both
var supportedCultures = new[]
{
new CultureInfo("th-TH"),
};
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("th-TH"),
// Formatting numbers, dates, etc.
SupportedCultures = supportedCultures,
// UI strings that we have localized.
SupportedUICultures = supportedCultures
});
and
public class InternationalizationAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var cultureInfo = CultureInfo.GetCultureInfo("th-TH");
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
}
}
then put [Internationalization] on controller class.
both produce the same error.
After running, just try to put anythings in login page.
Expected behavior: Invalid login attempt.
Output:
PostgresException: 42703: column "__normalizedusername_0" does not exist
This also happens in another controller where I have parameter type int or string too.
Confirmed this is a bug in EF Core, submitted fix.
We have this issue in production. We would really like this fix in 3.1. Why is it needed to wait until 5.0? Clearly a bug. It did work in 2.2.
Can you implement a workaround in Postgres provider, @roji ?
@ajcvickers what do you think?
At the very worst, it's possible to work around this by extending the SqlGenerationHelper of the provider you're using and override GenerateParameterName.
I have implemented suggested work-around and it appears to work
Will show solution here if anyone else needs it. But I do believe this change would be nice to get into mainline, seems really trivial fix.
public class OrdinalCompareNpgsqlGenerationHelper : NpgsqlSqlGenerationHelper
{
public OrdinalCompareNpgsqlGenerationHelper(RelationalSqlGenerationHelperDependencies dependencies)
: base(dependencies)
{
}
public override string GenerateParameterName(string name)
=> name.StartsWith("@", StringComparison.Ordinal)
? name
: "@" + name;
}
var dbContextOption = new DbContextOptionsBuilder<T>()
.UseNpgsql(dbConnectionOptions.ConnectionString)
.ReplaceService<ISqlGenerationHelper, OrdinalCompareNpgsqlGenerationHelper>()
We already fixed this in the 5.0 branch, so the first 5.0 preview will already contain this fix. At the moment we don't plan to patch this in 3.x, since the workaround is very easy and not many people are affected.
PR not merged yet.
Most helpful comment
I have implemented suggested work-around and it appears to work
Will show solution here if anyone else needs it. But I do believe this change would be nice to get into mainline, seems really trivial fix.