Я относительно новичок в EF7 и слышал, что внедрение зависимостей DbContexts в конструктор контроллера - хороший способ получить DbContext для использования в заданных методах действия. Однако есть много ситуаций, когда внедрение зависимостей невозможно (например, доступ к базе данных в обычных классах), и необходимо использовать шаблон using(VectorDbContext dbContext...)
.
Я столкнулся с проблемой, когда добавление данных в DbContext, созданное с помощью шаблона using
, не может быть доступно контексту, в который была введена зависимость. DbContext - это простая база данных InMemory, используемая для тестирования - она ни к чему не подключается.
Вот код, который добавляет сущности в DbContext, для тестирования я вызываю это в Startup.cs:
using (ExampleDbContext dbContext= new ExampleDbContext()) {
dbContext.Things.Add(
new Thing() {
Stuff= "something"
});
dbContext.SaveChanges();
}
Вот код доступа в контроллере:
public class ExampleController : Controller {
public ExampleController(ExampleDbContext exampleDbContext) {
this.ExampleDbContext= exampleDbContext;
}
public ExampleDbContext ExampleDbContext { get; set; }
public async Task<IActionResult> ExampleAction() {
// new DbContext:
using(ExampleDbContext dbContext = new ExampleDbContext ()) {
var List1 = (await dbContext.Things
.AsNoTracking()
.ToListAsync());
}
// Injected DbContext:
var List2 = (await this.ExampleDbContext.Things
.AsNoTracking()
.ToListAsync());
}
}
При пошаговом прохождении List1 содержит ожидаемый один элемент, но List2 всегда пуст!
Что я делаю неправильно? Похоже, что DbContexts каким-то образом не синхронизируются, как инъекция зависимостей создает DbContext / откуда он?
РЕДАКТИРОВАТЬ: Я только что провел дополнительное тестирование и подтвердил, что любые объекты, добавленные в DbContext, созданные с помощью new
, видны только в new
, а объекты, добавленные в Injected DbContext, видны только внутри Injected DbContext, что заставляет меня поверить, что они подключаются к разным базам данных, но я не могу подтвердить.
DbContext
, но разве каждый из них не должен выходить за пределы своего внутреннего кеша и напрямую запрашивать базу данных и, следовательно, возвращать одни и те же данные? - person Sergey Kolodiy   schedule 29.01.2015