Страницы с тегами : Entity Framework

Подборка материалов о серверной оптимизации ASP.NET

В процессе подготовки семинара по оптимизации, который пройдет 30 октября 2014 года (регистрация тут - http://gandjustas.timepad.ru/event/150915/), я собрал ранее опубликованные материалы по серверной оптимизации ASP.NET приложений.
Серия постов о кешировании на хабре:
Оптимизация работы с данными:
Какие темы вам еще будут интересны?


Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server с помощью LINQ

Доклад с таким длинным и непонятным названием я читал на SQL Server User Group 10 сентября в Москве. Ниже слайды запись доклада:

К сожалению, как обычно я не показал все что хотел, часть материала не попала на видео запись. Но я восполню этот недостаток.
Как вы думаете, можно ли на 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);