Entity Framework Core и UseInMemoryDatabase - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь написать тесты, используя Entity Framework Core UseInMemoryDatabase, поэтому мои настройки выглядят так:

    [SetUp]
    public void Setup()
    {
        this.ContextOptions = new DbContextOptionsBuilder<GeneralContext>()
            .UseInMemoryDatabase(databaseName: "DiagAc2Tests")
            .Options;
    }

Я не знаю, нужно ли это, но контекст выглядит так:

public class GeneralContext : DbContext
{
    public DbSet<Entities.Application> Applications { get; set; }
    public GeneralContext() { }
    public GeneralContext(DbContextOptions<GeneralContext> options) : base(options) { }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var config = new DatabaseConfiguration();
        optionsBuilder.UseNpgsql(config.GetConnectionString());
    }
}

Я использую этот контекст в своем приложении, и он работает, поэтому мой тест выглядит следующим образом:

        public async Task CreateApplicationByService()
        {
            Mock<DTO.IApplication> mock = new Mock<DTO.IApplication>();
            mock.SetupProperty(f => f.Name, "Application");
            mock.SetupProperty(f => f.ProjectId, 666);
            mock.SetupProperty(f => f.ConfigFilePath, null);

            DTO.IApplication appDto = mock.Object;

            var entity = this.Mapper.Map<DTO.IApplication, Application>(appDto);
            try
            {
                using var context = new GeneralContext(this.ContextOptions);
                await context .ApplicationRepository.Add(entity);
            }
            catch (Exception ex)
            {
                var t = ex;
            }

            var one = 1;
            var two = 2;
            Assert.True(one != two);
        }

У меня нет никаких утверждений, поэтому добавляется это глупое утверждение, но когда я добавляю запись через Я получаю контекст:

Службы для поставщиков баз данных 'Microsoft.EntityFrameworkCore.InMemory', 'Npg sql .EntityFrameworkCore. PostgreSQL' зарегистрированы в поставщике услуг. Только один поставщик базы данных может быть зарегистрирован в поставщике услуг. Если возможно, убедитесь, что Entity Framework управляет своим поставщиком услуг, удалив вызов UseInternalServiceProvider. В противном случае рассмотрите возможность условной регистрации поставщика базы данных или поддержки одного поставщика услуг для каждого поставщика базы данных.

Я сделал все в соответствии с документацией по MSDN, поэтому что может быть не так?

Ответы [ 2 ]

2 голосов
/ 24 января 2020
optionsBuilder.UseNpgsql(config.GetConnectionString());

Ошибка в этой строке и это пример инверсии управления. Вы не должны вызывать UseNpqSql в пределах OnConfiguring.. Это означает, что он попытался использовать 2 базы данных.

this.ContextOptions = new DbContextOptionsBuilder<GeneralContext>()
        .UseInMemoryDatabase(databaseName: "DiagAc2Tests")
        .Options;

optionsBuilder.UseNpgsql(config.GetConnectionString());

Будут выполнены оба приведенных выше оператора.

Теперь решение этой проблемы - переместить UseNpg sql за пределы настройки и в класс запуска вашего приложения. Это, конечно, зависит от вашего проекта и от того, как вы хотите его достичь.

0 голосов
/ 24 января 2020

В тестовом проекте вы можете использовать отдельный класс Startup, чем ваше приложение, и вы можете удалить UseNpg sql из вашего класса Startup в тестовом проекте, поскольку вы хотите использовать базу данных In Memory.

...