2017-02-20 57 views
5

Entity Framework może działać bardzo wolno przy masowych operacjach wstawiania/aktualizacji/usuwania. Nawet często sugerowane poprawki do wyłączania AutoDetectChanges i/lub ValidateOnSaveEnabled nie zawsze pomagają.Czy istnieje niekomercyjna alternatywa dla Z.EntityFramework.Extensions?

Natknąłem się na Z.EntityFramework.Extensions na NuGet, ale wydaje się, że jest to produkt komercyjny, który działa tylko przez pewien okres czasu.

https://www.nuget.org/packages/Z.EntityFramework.Extensions/

tej pory tak naprawdę wystarczy BulkInsert(), BulkUpdate() i BulkDelete().

Moje pytanie brzmi:

Czy istnieje niezawodny biblioteka niekomercyjnym, że ma prawie taki sam jak Z.EntityFramework.Extensions?

Dzięki za wszelkie wskazówki!

+0

do aktualizacji i usuwania wsadowym można użyć https: // github .com/loresoft/EntityFramework.Extended. W przypadku wsadu wsadowego - wystarczy utworzyć nowy kontekst co 100 elementów. Stwórz więc kontekst, wstaw 100, zapisz zmiany. Następnie utwórz nowy, włóż następne 100, zapisz zmiany itp. Zawiń wszystko w zakresie transakcji. To nie jest tak naprawdę wstawianie wsadowe, ale będzie znacznie szybsze niż wstawianie wszystkich obiektów w tej samej instancji kontekstu. – Evk

+0

ORMy na ogół * NIE * nadają się do operacji wsadowych, znacznie mniej wkładek luzem. To tak, jakby za pomocą pincety transportować ciężarówkę kamyków. Nie można tego ukryć żadnym rozszerzeniem. Najlepszą opcją dla insertów masowych jest użycie SqlBulkCopy do wykonania * rzeczywistej *, minimalnie zarejestrowanej operacji przesyłania strumieniowego luzem. Jeśli chcesz wykonywać aktualizacje zbiorcze, po prostu użyj odpowiedniej instrukcji UPDATE.Jeśli chcesz * UPSERT * ze źródeł zewnętrznych, zaimportuj wszystko do tabeli pomostowej i użyj polecenia MERGE, aby zaktualizować tabelę docelową. –

+0

Innymi słowy, szukasz czegoś, co może przekonwertować niewiarygodny, niebezpieczny, niemożliwy do skalowania proces jeden. Dlaczego nie skorzystać z niezawodnego, skalowalnego procesu od samego początku? –

Odpowiedz

2

Zastrzeżone: Jestem właścicielem Entity Framework Extensions

Masz rację. To jest produkt komercyjny.

Co miesiąc dostępna jest bezpłatna wersja próbna, ale należy zakupić produkt w środowisku produkcyjnym.

Luzem Wstaw

Dla BulkInsert, istnieją darmowe alternatywy, ale należy uważać, że nie obsługuje wszystkich spadków & skojarzeń i nie są już obsługiwane:

Zastrzeżone: Jestem właścicielem Entity Framework Plus

dla partii Aktualizacja & & Batch Usuń, można korzystać z tej biblioteki:

// DELETE all users which has been inactive for 2 years 
ctx.Users.Where(x => x.LastLoginDate < DateTime.Now.AddYears(-2)) 
     .Delete(); 

// UPDATE all users which has been inactive for 2 years 
ctx.Users.Where(x => x.LastLoginDate < DateTime.Now.AddYears(-2)) 
     .Update(x => new User() { IsSoftDeleted = 1 }); 
+0

Dziękuję, Jonathan. Zaznaczę to jako poprawną odpowiedź, ponieważ uważam, że jako właściciel takiego produktu masz dobry ogląd innych konkurentów. Naprawdę przykro, że nie ma wkładki w EF Plus, ale myślę, że musi istnieć pewne rozróżnienie na produkt komercyjny. – Michael

+1

Niestety, próbowaliśmy zaoferować pewne funkcje Open Source, ale ten model biznesowy po prostu nie działa. Tak, potrzebujemy rozróżnienia między obiema bibliotekami. Projekty open source/free przez większość czasu nie są wspierane po pewnym czasie, ponieważ koszt/czas/złożoność są dramatycznie zwiększane, ponieważ coraz więcej użytkowników z niego korzysta. Na przykład w ubiegłym roku ta bezpłatna biblioteka zabrała nam więcej czasu niż nasze inne biblioteki połączone! –

+0

Cześć Michael, tylko zastanawiasz się, czy natknąłeś się na SqlBulkTools podczas swoich badań? –