EF Core 2.1 В памяти БД не обновляются записи - PullRequest
0 голосов
/ 25 мая 2018

Я использую провайдер базы данных в памяти для интеграционных тестов, но я не могу обновить запись.Я запустил тот же код для реальной базы данных SQL, и все прекрасно обновляется.Вот мой код испытательного прибора.

Испытательный прибор:

public class TestFixture<TStartup> : IDisposable
{
    private readonly TestServer _testServer;
    public HttpClient TestClient { get; }
    public IDatabaseService DbContext { get { return _testServer.Host.Services.GetService<DatabaseService>(); } }

    public TestFixture() : this(Path.Combine("src")) { }

protected TestFixture(string relativeTargetProjectPatentDir)
{
    Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Testing");

    var builder = new WebHostBuilder()
        .ConfigureServices(services =>
        {
            services.AddDbContext<DatabaseService>(options =>
                options.UseInMemoryDatabase("TestDB")
                .EnableSensitiveDataLogging());
        })
        .UseEnvironment("Testing")
        .UseStartup<Startup>();

    _testServer = new TestServer(builder)
    {
        BaseAddress = new Uri("http://localhost:5010")
    };

    TestClient = _testServer.CreateClient();
    TestClient.BaseAddress = _testServer.BaseAddress;
}

    public void Dispose()
    {
        TestClient.Dispose();
        _testServer.Dispose();
    }
}

Я провел большую часть дня в поисках этого продукта и не сталкивался ни с кем другим, кто говорил оэто так, я предполагаю, что это, вероятно, моя проблема, а не ошибка EF.Я уверен, что кто-то заметил бы БД, которую вы не можете обновить.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Ну, может быть, DbContext используется неправильно.У меня такая же проблема.Я использовал DbContext так же, как вы.Я просто вернул экземпляр на .Host.Services.GetService<TContext>.Проблема этого подхода заключается в том, что DbContext никогда не будет освобождать отслеживаемые объекты, поэтому либо вы устанавливаете сущность State как EntityState.Detached, и вы заставляете DbContext перезагрузить ее, либо будете использовать области действия.

using (var scope = _testServer.Host.Services.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
  var dbContext = scope.ServiceProvider.GetRequiredService<DatabaseService>();
  //make any operations on dbContext only in scope
}
0 голосов
/ 28 июня 2018

Оказалось, что изменение времени жизни моего DbContext в моем тестовом приборе на singleton решило мою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...