Как Добавить Представление в EF Core DbContext
Представление (View) - это виртуальная таблица, основанная на результатах предопределённого запроса. Представления позволяют инкапсулировать сложный запрос в логический объект в базе данных.
Допустим, у нас есть две таблицы: продуктов (
Products) и оценок продуктов (Ratings). Наша цель - создать представление SQL, которое может упростить следующий оператор LINQ:var prodRatings =
db.Products
.Select(x => new {
id = x.Id,
name = x.Name,
avg = x.Ratings.Average(r => r.Stars)
});
Сначала нужно создать пустую миграцию, чтобы добавить определение представления:
dotnet ef migrations add ProductRatingAvg
Затем откроем файл новой миграции в папке
Migrations. Он содержит два метода, в которые добавляется код, выполняемый при применении (Up) и откате (Down) миграции. Мы можем вручную добавить любой код, который хотим выполнить. Например, для создания представления добавим выполнение произвольного Sql запроса:public partial class ProductRatingAvg : Migration
{
protected override void
Up(MigrationBuilder mb)
{
mb.Sql(@"
create view ProductAverages as
select p.Id, p.Name, avg(r.Stars) as AverageRating
from Products p inner join Ratings r on p.Id = R.ProductionId
group by p.Id, p.Name;");
}
protected override void
Down(MigrationBuilder mb)
{
mb.Sql(@"drop view ProductAverages;");
}
}
Следующий шаг – добавить модель
ProductAverage в DbContext:public class ProductAverage {
public int Id { get; set; }
public string Name { get; set; }
public double AverageRating { get; set; }
}
public DbSet<ProductAverage> ProductAverages { get; set; }
Далее привяжем сущность к представлению в методе
DbContext.OnModelCreating:modelBuilder
.Entity<ProductAverage>()
.ToView(nameof(ProductAverages))
.HasKey(t => t.Id);
Наше свойство
ProductAverages называется так же, как представление, поэтому мы можем использовать nameof, хотя в метод ToView() можно передать любую строку.Теперь мы можем использовать наше новое представление так же, как любой другой
DbSet:var db = new MyDbContext();
…
var averages =
await db.ProductAverages.ToListAsync();
Помните, что эта коллекция является представлением, и любая попытка обновить данные потерпит неудачу. Некоторые базы данных поддерживают обновления представлений, но только если мы определяем представление на основе одной таблицы.
Источник: https://khalidabuhakmeh.com/how-to-add-a-view-to-an-entity-framework-core-dbcontext