TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.75K subscribers
Post #1179 1.4K
День девятьсот шестьдесят первый. #ЗаметкиНаПолях
Как Добавить Представление в 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
More from @netdeveloperdiary
  1. Oct 1, 2026Post #3357
  2. Sep 30, 2026Post #3356
  3. Sep 29, 2026Фото 3 (с) Анатолий Кулаков
  4. Sep 29, 2026День 2799. Конференция DotNext 2026. Часть 1 25 и 26 сентября в Москве прошла очередная ко…
  5. Sep 28, 2026День 2798. #Оффтоп Утиная Типизация в C# с Помощью Перехватчиков. Часть 2 Некоторое время…
  6. Sep 27, 2026День 2797. #ЗаметкиНаПолях #AI Рабочий процесс с Copilot для .NET. Окончание Начало Продол…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →