Страницы с тегами : Entity Framework
Подборка материалов о серверной оптимизации ASP.NET
Серия постов о кешировании на хабре:
- Стратегия кеширования
- Как прикрутить кеширование к ASP.NET приложению
- Применение инфраструктуры кеширования ASP.NET
- Интеграция кеша ASP.NET с Redis и зависимости кеша от БД
Какие темы вам еще будут интересны?
Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server с помощью LINQ
К сожалению, как обычно я не показал все что хотел, часть материала не попала на видео запись. Но я восполню этот недостаток.
Как вы думаете, можно ли на Linq делать запросы, которые работают быстрее рукопашных? Оказывается да, и очень просто.
Например надо сделать функцию, которая отбирает заказы по дате отгрузки. Если параметр указал, то выбрать заказы за эту дату. А если не указана дата, то выбрать все заказы, у которых дата отгрузки пустая. Обычный разработчик напишет такую процедуру:
CREATE PROCEDURE [dbo].[GetTransactionsByShipDate] @shipDate datetime AS SELECT t.Id, t.ProductId, t.TransactionDate from Transactions t where (@shipDate is not null and t.ShippedDate = @shipDate) or (@shipDate is null and t.ShippedDate is null)
Аудит изменений в Entity Framework
В Entity Framework v1 есть возможность подписаться на событие SavingChanges. Это событие вызывается перед записью в базу когда вызывается метод SaveChanges. Чтобы получить все измененные записи в контексте необходимо обратиться к свойству ObjectStateManager контекста и вызвать его метод GetObjectStateEntries.
Ниже приведен код partial класса контекста, который сохраняет изменения сущностей.
1: partial void OnContextCreated()
Баг в Entity Framework
Обнаружил очень неприятный баг с Entity Framework.
ObjectContext грузит метаданные не при конструировании, а при первом обращении к методам загрузки данных. При этом вызывается this.MetadataWorkspace.LoadAssemblyForType((тип), Assembly.GetCallingAssembly());
Если вызывающая сборка (Assembly.GetCallingAssembly()) не содержит прямой или косвенной ссылки на сборку с метаданными, то загружены они не будут и любой метод чтения отвалится с непонятной ошибкой.
Я наткнулся на такую ситуацию когда вынес extension-метод для ObjecxtContext в отдельную сборку, которая не имела ссылки на сборку с моделью. Сам extension-метод вызывался для только что созданного контекста.
Workaround для этого такой: для только что созданного контекста вызвать context.MetadataWorkspace.LoadFromAssembly(context.GetType().Assembly);