Jarosław S.

Jarosław S. Kierownik Działu
Rozwoju Aplikacji
.NET, ITeam SA

Temat: ASP.NET i Entity Framework - czy taka "para" w ogóle ma...

Ostatnio przyglądam się trochę Entity Framework i mam poważne wątpliwości, czy tą technologię w ogóle można rozważać w kontekście aplikacji ASP.NET.

Moje wątpliwości wynikają z faktu, że tworzenie obiektu ObjectContext jest bardzo czasochłonne (nic dziwnego - przetwarzane są metadane opisujące poszczególne modele), a obiekt ten nie nadaje się do cache-owania i współdzielenia. Najbardziej pracochłonne jest tak naprawdę tworzenie EntityConnection, ale ta klasa dziedziczy z DbConnection, co z definicji ją wykreśla jako kandydata do cache-owania i współdzielenia w aplikacji ASP.NET (zwykle potrzebuję osobnej transakcji dla każdego z klientów :-)).

Jest jeszcze coś takiego jak MetadataWorkspace, ale jeszcze nie rozgryzłem do końca, czym to się je.

Ciekawe jest to, że wszystkie "oficjalne" przykłady na MSDN-ie dotyczące aplikacji ASP.NET (np. Human Resources ASP.NET Web Site) korzystają z każdorazowego tworzenia instancji klasy ObjectContext (w tym wypadku o nazwie HRSkillsEntities), czyli rozwiązania bardzo mało wydajnego.

Wykonałem prosty test (wykonanie 100 operacji zapisu do bazy każdorazowo tworząc i zwalniając obiekt klasy ObjectContext) i wyniki były "lekko" niepokojące: analogiczne rozwiązania oparte o TableAdapter lub LinqToSql były kilka razy szybsze. Ja wiem, że zawsze można dołożyć kilka serwerów, ale kilkukrotna różnica w wydajności to moim zdaniem zdecydowanie za dużo.

Podsumowując moje pytanie brzmi:
Jakie są zalecane sposoby tworzenia instancji ObjectContext w aplikacjach ASP.NET / usługach / innych aplikacjach bezstanowych?
Jarosław S.

Jarosław S. Kierownik Działu
Rozwoju Aplikacji
.NET, ITeam SA

Temat: ASP.NET i Entity Framework - czy taka "para" w ogóle ma...

Właśnie doświadczalnie sprawdziłem, że wystarczy cache-ować instancję MetadataWorkspace, za każdym razem tworząc nowy EntityConnection oraz ObjectContext i to wystarczy, aby znacznie
przyspieszyć działanie aplikacji (czyli uzyskać wydajność zbliżoną do TableAdapter / LinqToSql).

Jednak ponieważ nie wiem co dokładnie Entity Framework robi z MetadataWorkspace, nie mam pewności czy przy wielodostępie nie będzie z tego jakichś dodatkowych problemów.

Poza tym potrzeba buforowania metadanych wydaje się tak oczywista,
że aż nie chce mi się wierzyć, że w Entity Framework nie ma wbudowanego mechanizmu, który to realizuje "out-of-the-box".

Co ciekawe MSDN mówi o cache-owaniu metadanych na podstawie ConnectionString, ale w praktyce to nie wydaje się działać (przynajmniej u mnie nie działa).

Dla pełnej jasności poniżej kawałek kodu o którym mowa:

for (int i = 0; i < 100; i++)
{
using (TestModelContainer tc = new TestModelContainer (WebConfigurationManager.ConnectionStrings["TestModelContainer"].ConnectionString))
{
TestContract contract = new TestContract();
... ustawienie atrybutów...

tc.AddToTestContract(contract);
tc.SaveChanges();
}
}Jarosław S. edytował(a) ten post dnia 14.08.08 o godzinie 18:00

Następna dyskusja:

Using Entity Framework Code...




Wyślij zaproszenie do