Решение было следующее, EF нужно было прописать провайдер для того, чтобы он мог мапать числа с плавающей точкой адекватно.
//в стартапе
services.AddControllersWithViews(
options => options.ModelBinderProviders.Insert(0, new InvariantDecimalModelBinderProvider()));
public class InvariantDecimalModelBinderProvider : IModelBinderProvider
{
private readonly ILoggerFactory loggerFactory;
public IModelBinder GetBinder(ModelBinderProviderContext context)
{
if (context == null) throw new ArgumentNullException(nameof(context));
if (!context.Metadata.IsComplexType && (context.Metadata.ModelType == typeof(decimal) || context.Metadata.ModelType == typeof(decimal?)))
{
ILoggerFactory loggerFactory = context.Services.GetRequiredService<ILoggerFactory>();
return new InvariantDecimalModelBinder(context.Metadata.ModelType, loggerFactory);
}
return null;
}
}
public class InvariantDecimalModelBinder : IModelBinder
{
private readonly SimpleTypeModelBinder _baseBinder;
public InvariantDecimalModelBinder(Type modelType, ILoggerFactory loggerFactory)
{
_baseBinder = new SimpleTypeModelBinder(modelType, loggerFactory);
}
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null) throw new ArgumentNullException(nameof(bindingContext));
var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (valueProviderResult != ValueProviderResult.None)
{
bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueProviderResult);
var valueAsString = valueProviderResult.FirstValue;
decimal result;
if (decimal.TryParse(valueAsString, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out result))
{
bindingContext.Result = ModelBindingResult.Success(result);
return Task.CompletedTask;
}
}
it
return _baseBinder.BindModelAsync(bindingContext);
}
}