У меня есть EF core code первое веб-приложение API.
Существует сущность Products и дочерняя сущность UserProductsRating (с отношением один ко многим)
Я также хотел получить среднюю оценку за обзор (и иметь возможность выбирать / сортировать по нему), поэтому создал представление для этого (используя метод, описанный в этом ответе).
[https://stackoverflow.com/a/18707413][1])
Итак, миграция для моего вида выглядит так:
protected override void Up(MigrationBuilder migrationBuilder)
{
string script =
@"
CREATE VIEW AverageProductRating AS
SELECT u.ProductId, AVG(CAST(u.Rating AS FLOAT)) as AverageRating
FROM dbo.UserRatings u GROUP BY u.ProductId";
migrationBuilder.Sql(script);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
string script = @"DROP VIEW dbo.AverageProductRating";
migrationBuilder.Sql(script);
}
Тогда сверху находится сущность AverageRating.
Это все отлично работает и позволяет мне создавать запросы вроде:
var top5Products = _db.Products.Include(x => x.AverageProductRating)
.Where(x => x.AverageProductRating != null)
.OrderByDescending(x => x.AverageProductRating.AverageRating)
.Take(5);
Проблема возникает, когда я попадаю на тесты модулей / интеграций. Я использую InMemoryDatabase с EnsureCreated для настройки данных экземпляра / начального уровня тестирования.
var options = new DbContextOptionsBuilder<ProductsContext>()
.UseInMemoryDatabase(Guid.NewGuid().ToString())
.EnableSensitiveDataLogging()
.Options;
var context = new ProductsContext(options);
context.Database.EnsureCreated();
Когда я запускаю тесты против этого, у Entity AverageProductRating всегда есть ноль строк (я не уверен, создается ли представление вообще или нет)
Я думаю, что это может быть связано с ограничениями в SQL в db памяти или с тем, как выполняются миграции, но я не уверен.
Любые предложения о том, как обойти это, будут приветствоваться
Спасибо