SlideShare a Scribd company logo
ENTITYFRAMEWORK
Фишки и подводные камни
1
МАЙКЛБАШУРОВ
vk.com/saito_nakamura
2
ФИШКИ
3
ПОНИЖЕННАЯ
ПРОИЗВОДИТЕЛЬНОСТЬШИРОКИХ
ТАБЛИЦ
УБРАТЬLAZY‐LOADINGБЕЗINCLUDE
Как выбрать часть столбцов?
Как удобно и эффективно достать из
справочников нужные данные?
4 . 1
OBJECTINITIALIZER
var invoiceViews = invoicesQuery.Select(invoice => new InvoiceView()
  { 
    Id = invoice.Id, 
    Number = invoice.Number, 
    Client = new ClientView() 
    {
        Id = invoice.Client.Id, 
        Name = invoice.Client.Name, 
    }, 
  } 
  .OrderByDescending(invoiceView => invoiceView.Number) 
  .ToList()
4 . 2
КАКТРАНСЛИРОВАТЬ
PROPERTY?
5 . 1
MICROSOFTLINQTRANSLATION
using Microsoft.Linq.Translation; 
public class Invoice 
{ 
    public static readonly CompiledExpression<Invoice, int> 
        productsCountExpression = 
        DefaultTranslationOf<Invoice> 
            .Property(e => e.ProductsCount) 
            .Is(e => e.Products.Count()); 
    public int ProductsCount => 
        productsCountExpression.Evaluate(this); 
}
5 . 2
var top10InvoicesWithMostProducts = invoicesQuery 
    .OrderByDescending(invoice => invoice.ProductsCount) 
    .WithTranslation() 
    .Take(10) 
    .ToList()
5 . 3
var top10InvoicesWithMostProducts = invoicesQuery 
    .OrderByDescending(invoice => invoice.Products.Count()) 
    .Take(10) 
    .ToList()
5 . 4
CHANGETRACKER
6 . 1
ТРИГГЕРНАC#!
Предпросчитывать значения
Оповещать об изменениях
Писать лог
?????
PROFIT
foreach (var dbEntityEntry in _context.ChangeTracker.Entries() 
    .Where(x => x.State == EntityState.Added 
        || x.State == EntityState.Modified 
        || x.State == EntityState.Deleted)) 
{ 
    // Do something with it... 
}
Пример на github
6 . 2
ASNOTRACKING
var invoicesWithoutChangeTracking = _dbContext.Invoices 
                    .AsNoTracking();
6 . 3
КАСТУЕМ
7 . 1
MAXWITHCASTONSTRING
invoices 
    .Where(x => SqlFunctions.IsNumeric(x.Number + ".0e0") == 1) 
    .Select(x => x.Number) 
    .Cast<int>() 
    .Max()
Select Max, but only on numeric values with LINQ to
Entities
7 . 2
ПОДВОДНЫЕКАМНИ
8
ВЧЕМПРОБЛЕМА?
var tasks = invoicesQuery 
     .Where(invoice => invoice.CompanyId == companyId) 
     .ToList();
9 . 1
СРАВНЕНИЕСNULL
var invoicesByCompany = invoicesQuery 
         .Where(invoice => invoice.CompanyId == companyId) 
         .ToList();
9 . 2
РЕШЕНИЕВЛОБ
var invoicesByCompany = invoicesQuery.Where(invoice => 
    companyId != null 
        ? invoice.CompanyId == companyId 
        : invoice.CompanyId == null 
    )
    .ToList();
9 . 3
EQUALS
var invoicesByCompany = invoicesQuery 
         .Where(invoice => invoice.CompanyId.Equals(companyId)) 
         .ToList();
9 . 4
ИНКАПСУЛЯЦИЯ
Expression<Func<Invoice, bool>> CompanyIs(int? companyId) => 
    invoice => 
        companyId != null 
            ? invoice.CompanyId == companyId 
            : invoice.CompanyId == null; 
var invoicesByCompany = invoicesQuery 
    .Where(CompanyIs(companyId)) 
    .ToList();
9 . 5
RELATIONSHIPFIXUP
var invoice = new Invoice();
var client = invoice.Client; // null
invoice.ClientId = clientId;
client = invoice.Client; // null, ну да, еще в контекст не добавили
clientFromContext.Invoices.Add(invoice);
client = invoice.Client; // все еще null 
// теперь Add для navigation property не вызывает DetectChanges()
_dbContext.Invoices.Add(invoice);
client = invoice.Client; 
// опять null, может надо явно вызвать DetectChanges?
_dbContext.DetectChanges();
client = invoice.Client; // нет, не помогло, null, может сохранить?
_dbContext.SaveChanges();
client = invoice.Client; // нет, все еще null, что за фигня?
10 . 1
DYNAMICPROXYПРОСТО
ОТКРЫВАЛСЯ
var invoice = _dbContext.Invoices.Create();
var client = invoice.Client; // null
invoice.ClientId = clientId;
client = invoice.Client; // null, ну да, еще в контекст не добавили
clientFromContext.Invoices.Add(invoice);
client = invoice.Client; // все еще null 
// теперь Add для navigation property не вызывает DetectChanges()
_dbContext.Invoices.Add(invoice);
client = invoice.Client; // УРА, не null!
10 . 2
ВОКРУГCODEFIRSTЗА80
ДНЕЙ
11 . 1
CONVENTIONALMAPPING
public class Invoice 
{ 
    public int Id { get; set; } 
    public virtual ICollection Products { get; set; } 
} 
public class Product 
{ 
    public int InvoiceId { get; set; } 
} 
11 . 2
ЕСТЬЛИРЕШЕНИЕ?
Может быть, отключить ?какой‐нибудь convention
11 . 3
TABLEPERINHERITANCE
12 . 1
CODEFIRST
public class Audit 
{ 
} 
public class InvoiceAudit : Audit 
{ 
  public int EntityId { get; set; } 
  [ForeignKey(“EntityId”)] 
  public virtual Invoice Invoice { get; set; } 
}
12 . 2
СПАСИБО!
Транслируемые property
Использование ChangeTracker для логирования
изменений
Пояснение про Cast
Презентация
Контакт
13

More Related Content

Similar to Михаил Башуров «Entity Framework: фишки и подводные камни»

Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0
akrakovetsky
 
Архитектура Drupal Commerce. Основы работы с Drupal Commerce
Архитектура Drupal Commerce. Основы работы с Drupal CommerceАрхитектура Drupal Commerce. Основы работы с Drupal Commerce
Архитектура Drupal Commerce. Основы работы с Drupal Commerce
Oleksandr Milkovskyi
 
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, ControllersШкола-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, ControllersГлеб Тарасов
 
Быстрое создание облачного ЦОД на базе решения EMC HybridCloudи конвергентной...
Быстрое создание облачного ЦОД на базе решения EMC HybridCloudи конвергентной...Быстрое создание облачного ЦОД на базе решения EMC HybridCloudи конвергентной...
Быстрое создание облачного ЦОД на базе решения EMC HybridCloudи конвергентной...Cisco Russia
 
Microsoft Visual Studio 2010
Microsoft Visual Studio 2010Microsoft Visual Studio 2010
Microsoft Visual Studio 2010
Alexander Babich
 
Dependency injection на примере unity и n inject
Dependency injection на примере unity и n injectDependency injection на примере unity и n inject
Dependency injection на примере unity и n injectRoman Kalita
 
Dependency Injection на примере Unity и NInject
Dependency Injection на примере Unity и NInjectDependency Injection на примере Unity и NInject
Dependency Injection на примере Unity и NInject
akrakovetsky
 
Решения на базе СУБД Firebird в крупных компаниях и государственных учреждени...
Решения на базе СУБД Firebird в крупных компаниях и государственных учреждени...Решения на базе СУБД Firebird в крупных компаниях и государственных учреждени...
Решения на базе СУБД Firebird в крупных компаниях и государственных учреждени...
Alexey Kovyazin
 
Aspect Oriented Approach
Aspect Oriented ApproachAspect Oriented Approach
Aspect Oriented Approach
Dmytro Chyzhykov
 
Андрей Лисниченко "SQL Injection"
Андрей Лисниченко "SQL Injection"Андрей Лисниченко "SQL Injection"
Андрей Лисниченко "SQL Injection"
Anna Shymchenko
 

Similar to Михаил Башуров «Entity Framework: фишки и подводные камни» (10)

Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0
 
Архитектура Drupal Commerce. Основы работы с Drupal Commerce
Архитектура Drupal Commerce. Основы работы с Drupal CommerceАрхитектура Drupal Commerce. Основы работы с Drupal Commerce
Архитектура Drupal Commerce. Основы работы с Drupal Commerce
 
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, ControllersШкола-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
 
Быстрое создание облачного ЦОД на базе решения EMC HybridCloudи конвергентной...
Быстрое создание облачного ЦОД на базе решения EMC HybridCloudи конвергентной...Быстрое создание облачного ЦОД на базе решения EMC HybridCloudи конвергентной...
Быстрое создание облачного ЦОД на базе решения EMC HybridCloudи конвергентной...
 
Microsoft Visual Studio 2010
Microsoft Visual Studio 2010Microsoft Visual Studio 2010
Microsoft Visual Studio 2010
 
Dependency injection на примере unity и n inject
Dependency injection на примере unity и n injectDependency injection на примере unity и n inject
Dependency injection на примере unity и n inject
 
Dependency Injection на примере Unity и NInject
Dependency Injection на примере Unity и NInjectDependency Injection на примере Unity и NInject
Dependency Injection на примере Unity и NInject
 
Решения на базе СУБД Firebird в крупных компаниях и государственных учреждени...
Решения на базе СУБД Firebird в крупных компаниях и государственных учреждени...Решения на базе СУБД Firebird в крупных компаниях и государственных учреждени...
Решения на базе СУБД Firebird в крупных компаниях и государственных учреждени...
 
Aspect Oriented Approach
Aspect Oriented ApproachAspect Oriented Approach
Aspect Oriented Approach
 
Андрей Лисниченко "SQL Injection"
Андрей Лисниченко "SQL Injection"Андрей Лисниченко "SQL Injection"
Андрей Лисниченко "SQL Injection"
 

More from SpbDotNet Community

Станислав Флусов «Sharing общих сборок между процессами и доменами в IIS»
Станислав Флусов «Sharing общих сборок между процессами и доменами в IIS»Станислав Флусов «Sharing общих сборок между процессами и доменами в IIS»
Станислав Флусов «Sharing общих сборок между процессами и доменами в IIS»
SpbDotNet Community
 
Егор Гришечко «У вас найдётся минутка, чтобы поговорить о блокчейне?»
Егор Гришечко «У вас найдётся минутка, чтобы поговорить о блокчейне?»Егор Гришечко «У вас найдётся минутка, чтобы поговорить о блокчейне?»
Егор Гришечко «У вас найдётся минутка, чтобы поговорить о блокчейне?»
SpbDotNet Community
 
Константин Васильев «Fody против рутины»
Константин Васильев «Fody против рутины»Константин Васильев «Fody против рутины»
Константин Васильев «Fody против рутины»
SpbDotNet Community
 
Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...
Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...
Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...
SpbDotNet Community
 
Слава Бобик «NancyFx для самых маленьких»
Слава Бобик «NancyFx для самых маленьких»Слава Бобик «NancyFx для самых маленьких»
Слава Бобик «NancyFx для самых маленьких»
SpbDotNet Community
 
Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»
Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»
Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»
SpbDotNet Community
 
Игорь Лабутин «Коллекционируем данные в .NET»
Игорь Лабутин «Коллекционируем данные в .NET»Игорь Лабутин «Коллекционируем данные в .NET»
Игорь Лабутин «Коллекционируем данные в .NET»
SpbDotNet Community
 
Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»
Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»
Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»
SpbDotNet Community
 
Артём Акуляков - F# for Data Analysis
Артём Акуляков - F# for Data AnalysisАртём Акуляков - F# for Data Analysis
Артём Акуляков - F# for Data Analysis
SpbDotNet Community
 
Анатолий Кулаков «The Metrix has you…»
Анатолий Кулаков «The Metrix has you…»Анатолий Кулаков «The Metrix has you…»
Анатолий Кулаков «The Metrix has you…»
SpbDotNet Community
 
Роман Неволин «Провайдеры типов без боли и магии»
Роман Неволин «Провайдеры типов без боли и магии»Роман Неволин «Провайдеры типов без боли и магии»
Роман Неволин «Провайдеры типов без боли и магии»
SpbDotNet Community
 
Дмитрий Верескун «Синтаксический сахар C#»
Дмитрий Верескун «Синтаксический сахар C#»Дмитрий Верескун «Синтаксический сахар C#»
Дмитрий Верескун «Синтаксический сахар C#»
SpbDotNet Community
 
Александр Саитов «Основы профилирования и оптимизации приложений в .NET»
Александр Саитов «Основы профилирования и оптимизации приложений в .NET»Александр Саитов «Основы профилирования и оптимизации приложений в .NET»
Александр Саитов «Основы профилирования и оптимизации приложений в .NET»
SpbDotNet Community
 
Сергей Лёвкин «Технологии Microsoft для актуальных трендов»
Сергей Лёвкин «Технологии Microsoft для актуальных трендов»Сергей Лёвкин «Технологии Microsoft для актуальных трендов»
Сергей Лёвкин «Технологии Microsoft для актуальных трендов»
SpbDotNet Community
 
Алексей Мерсон «Domain Driven Design: профит малой кровью»
Алексей Мерсон «Domain Driven Design: профит малой кровью»Алексей Мерсон «Domain Driven Design: профит малой кровью»
Алексей Мерсон «Domain Driven Design: профит малой кровью»
SpbDotNet Community
 
Егор Гришечко «Async/Await и всё, что вы боялись спросить»
Егор Гришечко «Async/Await и всё, что вы боялись спросить»Егор Гришечко «Async/Await и всё, что вы боялись спросить»
Егор Гришечко «Async/Await и всё, что вы боялись спросить»
SpbDotNet Community
 
Михаил Щербаков «Что может быть проще: делегаты и события»
Михаил Щербаков «Что может быть проще: делегаты и события»Михаил Щербаков «Что может быть проще: делегаты и события»
Михаил Щербаков «Что может быть проще: делегаты и события»
SpbDotNet Community
 
Никита Каменский «Есть ли жизнь с UWP?»
Никита Каменский «Есть ли жизнь с UWP?»Никита Каменский «Есть ли жизнь с UWP?»
Никита Каменский «Есть ли жизнь с UWP?»
SpbDotNet Community
 
Александр Кугушев «Roslyn: очевидные неочевидности»
Александр Кугушев «Roslyn: очевидные неочевидности»Александр Кугушев «Roslyn: очевидные неочевидности»
Александр Кугушев «Roslyn: очевидные неочевидности»
SpbDotNet Community
 
ДотаНетоЛогия: СПб 2017
ДотаНетоЛогия: СПб 2017ДотаНетоЛогия: СПб 2017
ДотаНетоЛогия: СПб 2017
SpbDotNet Community
 

More from SpbDotNet Community (20)

Станислав Флусов «Sharing общих сборок между процессами и доменами в IIS»
Станислав Флусов «Sharing общих сборок между процессами и доменами в IIS»Станислав Флусов «Sharing общих сборок между процессами и доменами в IIS»
Станислав Флусов «Sharing общих сборок между процессами и доменами в IIS»
 
Егор Гришечко «У вас найдётся минутка, чтобы поговорить о блокчейне?»
Егор Гришечко «У вас найдётся минутка, чтобы поговорить о блокчейне?»Егор Гришечко «У вас найдётся минутка, чтобы поговорить о блокчейне?»
Егор Гришечко «У вас найдётся минутка, чтобы поговорить о блокчейне?»
 
Константин Васильев «Fody против рутины»
Константин Васильев «Fody против рутины»Константин Васильев «Fody против рутины»
Константин Васильев «Fody против рутины»
 
Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...
Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...
Павел Федотовский «Как мы разрабатывали приложение для DotNetRu на Xamarin.Fo...
 
Слава Бобик «NancyFx для самых маленьких»
Слава Бобик «NancyFx для самых маленьких»Слава Бобик «NancyFx для самых маленьких»
Слава Бобик «NancyFx для самых маленьких»
 
Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»
Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»
Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»
 
Игорь Лабутин «Коллекционируем данные в .NET»
Игорь Лабутин «Коллекционируем данные в .NET»Игорь Лабутин «Коллекционируем данные в .NET»
Игорь Лабутин «Коллекционируем данные в .NET»
 
Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»
Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»
Станислав Сидристый «Шаблон Lifetime: для сложного Disposing»
 
Артём Акуляков - F# for Data Analysis
Артём Акуляков - F# for Data AnalysisАртём Акуляков - F# for Data Analysis
Артём Акуляков - F# for Data Analysis
 
Анатолий Кулаков «The Metrix has you…»
Анатолий Кулаков «The Metrix has you…»Анатолий Кулаков «The Metrix has you…»
Анатолий Кулаков «The Metrix has you…»
 
Роман Неволин «Провайдеры типов без боли и магии»
Роман Неволин «Провайдеры типов без боли и магии»Роман Неволин «Провайдеры типов без боли и магии»
Роман Неволин «Провайдеры типов без боли и магии»
 
Дмитрий Верескун «Синтаксический сахар C#»
Дмитрий Верескун «Синтаксический сахар C#»Дмитрий Верескун «Синтаксический сахар C#»
Дмитрий Верескун «Синтаксический сахар C#»
 
Александр Саитов «Основы профилирования и оптимизации приложений в .NET»
Александр Саитов «Основы профилирования и оптимизации приложений в .NET»Александр Саитов «Основы профилирования и оптимизации приложений в .NET»
Александр Саитов «Основы профилирования и оптимизации приложений в .NET»
 
Сергей Лёвкин «Технологии Microsoft для актуальных трендов»
Сергей Лёвкин «Технологии Microsoft для актуальных трендов»Сергей Лёвкин «Технологии Microsoft для актуальных трендов»
Сергей Лёвкин «Технологии Microsoft для актуальных трендов»
 
Алексей Мерсон «Domain Driven Design: профит малой кровью»
Алексей Мерсон «Domain Driven Design: профит малой кровью»Алексей Мерсон «Domain Driven Design: профит малой кровью»
Алексей Мерсон «Domain Driven Design: профит малой кровью»
 
Егор Гришечко «Async/Await и всё, что вы боялись спросить»
Егор Гришечко «Async/Await и всё, что вы боялись спросить»Егор Гришечко «Async/Await и всё, что вы боялись спросить»
Егор Гришечко «Async/Await и всё, что вы боялись спросить»
 
Михаил Щербаков «Что может быть проще: делегаты и события»
Михаил Щербаков «Что может быть проще: делегаты и события»Михаил Щербаков «Что может быть проще: делегаты и события»
Михаил Щербаков «Что может быть проще: делегаты и события»
 
Никита Каменский «Есть ли жизнь с UWP?»
Никита Каменский «Есть ли жизнь с UWP?»Никита Каменский «Есть ли жизнь с UWP?»
Никита Каменский «Есть ли жизнь с UWP?»
 
Александр Кугушев «Roslyn: очевидные неочевидности»
Александр Кугушев «Roslyn: очевидные неочевидности»Александр Кугушев «Roslyn: очевидные неочевидности»
Александр Кугушев «Roslyn: очевидные неочевидности»
 
ДотаНетоЛогия: СПб 2017
ДотаНетоЛогия: СПб 2017ДотаНетоЛогия: СПб 2017
ДотаНетоЛогия: СПб 2017
 

Михаил Башуров «Entity Framework: фишки и подводные камни»