2013-07-29 15 views
12

Próbuję użyć dapper-dot-net, aby przyspieszyć niektóre obszary mojej aplikacji mvc asp.net. Używam również kodu EF5.Czy mogę używać dapper-dot-net z Entity Framework?

Od elegancki-dot-net jest tylko kilka rozszerzeń dla IDbConnection, mogę tylko używać

DbContext.Database.Connection 

użyć elegancki-dot-net? Testuję, że działa. Jednak nie jestem pewien, czy jest to właściwy sposób korzystania z niego? W szczególności, kiedy używam tego sposobu, czy Entity Framework będzie miał wpływ, który może zaszkodzić wydajności?

Odpowiedz

6

Tak, możesz go używać w ten sposób. Ponieważ Dapper pracuje tylko nad metodami rozszerzenia, możesz go użyć w obszarach kodu wrażliwych na wydajność. I możesz nadal używać EF dla innych obszarów twojego kodu. Zapytania, które masz, które wciąż używają EF, nie będą tak szybkie, ale przynajmniej zapytania korzystające z Dapper będą szybsze.

+0

Na podstawie trudnych doznań, przez "szybszy" rozumiemy "dwa lub trzy rzędy wielkości szybciej". Miałem jedną wysoce zoptymalizowaną kwerendę w Entity Framework, która zajęła 10 minut, po konwersji na Dapper zajęło ułamek sekundy, aby ukończyć zapytanie o rozmiarze i złożoności 20x: http://stackoverflow.com/questions/9350467/how- do-i-write-one-to-many-query-in-dapper-net/30080951 # 30080951. – Contango

+0

@Contango Czy to było z AsNoTracking EF? –

+0

@Ian Warburton Nie jestem pewien - ale niezależnie od tego wydajność Dappera pozostawia Entity Framework w kurzu. Mówiąc to, Dapper jest nastawiony głównie na czytanie danych, więc jeśli chcesz pisać do bazy danych, to chyba Entity Framework zadziała, jeśli będzie zadowolony z nieefektywnej, miernej wydajności, która może obsłużyć prawdopodobnie 10 równoczesnych użytkowników. – Contango

11

Używanie Dappera może znacznie poprawić wydajność niektórych scenariuszy.

Możesz udostępnić połączenie EF za pomocą narzędzia Dapper. Jednak (choć mało prawdopodobne, aby stanowiło problem) powinieneś być świadomy problemów ze współbieżnością (np. Z powodu prób powiązania wielu czytników danych z tym samym połączeniem).

Jeśli napotkasz na takie problemy, możesz udostępnić nowe połączenie z Dapper za pomocą ciągu połączenia (DbContext.Database.Connection.ConnectionString) zamiast udostępniać połączenie.

+2

Chociaż * true *, jest to mało prawdopodobne, aby stanowiło problem w większości scenariuszy - wątek * z pewnością * nie jest prawdopodobnie czynnikiem, więc głównie pozostawia ryzyko otwartego czytnika danych - jest to dość łatwe do wykrycia (błąd nie jest zbyt subtelny) –

+4

@MarcGravell Wezmę na to twoje słowo :) Ale czy nie bezpieczniej jest zawsze podawać Dapperowi swoje własne połączenie (zamiast używać EF)? A może jest w tym niekorzyść? –