Ошибка EF Core: провайдер не поддерживает 'DateOnly
есть веб апи на .net 7, оно отлично запускается все миграции проходят корректно. Пишу интеграционные тесты для данного апи, для интеграционных тестов должна создаваться отдельная бд не в оперативной памяти:
ApiWebApplicationFactory:
using Api;
using Infrastructure.Database;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.AspNetCore.TestHost;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System.Data.Common;
namespace TestsApi.Common
{
public class ApiWebApplicationFactory : WebApplicationFactory<Program>
{
public IConfiguration Configuration { get; private set; }
public AccountinglocusContext DbContext { get; private set; }
public string ConnectionString { get; private set; }
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureAppConfiguration(config =>
{
Configuration = new ConfigurationBuilder()
.AddJsonFile("integrationsettings.json")
.Build();
config.AddConfiguration(Configuration);
});
builder.ConfigureTestServices(services =>
{
var dbContextDescriptor = services.SingleOrDefault(d =>
d.ServiceType == typeof(DbContextOptions<AccountinglocusContext>));
services.Remove(dbContextDescriptor);
var dbConnectionDescriptor = services
.SingleOrDefault(d => d.ServiceType == typeof(DbConnection));
services.Remove(dbConnectionDescriptor);
ConnectionString = Configuration.GetConnectionString("ConnectionStrTest");
services.AddDbContext<AccountinglocusContext>(options => options.UseSqlServer(ConnectionString));
var scope = services.BuildServiceProvider().CreateScope();
DbContext = scope.ServiceProvider.GetRequiredService<AccountinglocusContext>();
});
}
}
}
integrationsettings.json:
{
"ConnectionStrings": {
"ConnectionStrTest": "Data Source=(Localdb)\\MSSQLLocalDB; Initial Catalog=Integration;Integrated Security=True"
}
}
При запуске тестов получаю следующую ошибку:
System.InvalidOperationException: "The 'DateOnly' property 'VatPeriod.FromDate' could not be mapped to the database type 'date' because the database provider does not support mapping 'DateOnly' properties to 'date' columns. Consider mapping to a different database type or converting the property value to a type supported by the database using a value converter. See https://aka.ms/efcore-docs-value-converters for more information. Alternately, exclude the property from the model using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'."
Данная ошибка появляется только при запуске тестов, запуск апи происходит без ошибок.
Можно сказать что данная ошибка возникает из-за типа DateOnly, но почему тогда только при запуске тестов?
Ошибку выше исправить смог добавив конвертер типа DateOnly:
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace Infrastructure.Helpers
{
public class DateOnlyConverter : ValueConverter<DateOnly, DateTime>
{
public DateOnlyConverter() : base(
d => d.ToDateTime(TimeOnly.MinValue),
d => DateOnly.FromDateTime(d))
{ }
}
}
using Infrastructure.Helpers;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage;
using System.Data;
namespace Infrastructure.Database
{
public partial class MyContext : DbContext
{
private IDbContextTransaction? _currentTransaction;
public MyContext(DbContextOptions options) : base(options)
{
}
protected override void ConfigureConventions(ModelConfigurationBuilder builder)
{
builder.Properties<DateOnly>()
.HaveConversion<DateOnlyConverter>();
}
}
}
Но теперь появилась новая ошибка:
System.InvalidOperationException: "The current provider doesn't have a store type mapping for properties of type 'DateOnly'."
Не понимаю как решить данную проблему, почему она возникает только в тестах.
Если нужно больше информации - пишите
Ответы (1 шт):
После установки пакета NuGet ErikEJ, все стало работать корректно. спасибо за помощь Panagiotis Kanavos

