Ответ
Да, есть коммерческий опыт работы с Entity Framework Core в production-проектах. Основные направления работы и best practices:
1. Подход Code-First и миграции:
- Создание моделей (сущностей) и контекста, управление схемой БД через миграции.
// Генерация миграции и обновление БД dotnet ef migrations add AddProductTable dotnet ef database update
2. Производительность и оптимизация запросов:
- Использование
AsNoTracking()для read-only сценариев. - Явная загрузка связанных данных (
Include,ThenInclude) для решения проблемы N+1. - Проекции (
Select) для выборки только нужных полей.var orders = await context.Orders .Where(o => o.Date > DateTime.UtcNow.AddDays(-7)) .Select(o => new { o.Id, o.Total, CustomerName = o.Customer.Name }) .AsNoTracking() .ToListAsync();
3. Настройка моделей через Fluent API:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Product>()
.HasKey(p => p.Id);
.Property(p => p.Name)
.IsRequired()
.HasMaxLength(100);
.HasIndex(p => p.CategoryId);
}
4. Работа с сырыми SQL и хранимыми процедурами:
var products = context.Products
.FromSqlRaw("EXEC GetActiveProducts @MinPrice",
new SqlParameter("@MinPrice", 10.0))
.ToList();
5. Стратегии работы с контекстом:
- Использование Dependency Injection для регистрации контекста с областью действия (Scoped).
- Понимание жизненного цикла контекста для избежания проблем с кэшированием и утечками памяти.
6. Решение сложных сценариев:
- Обработка конкурентного доступа (Concurrency Tokens).
- Отложенная загрузка (Lazy Loading) и её подводные камни.
- Сложные типы (Owned Entities) и иерархии наследования (TPH, TPT).
Опыт включает развёртывание и поддержку приложений с EF Core на различных СУБД: SQL Server, PostgreSQL и SQLite.