Bug w Entity Framework Core 1.0 RTM!

Siemanko

Znalazłem buga (nie szukałem tylko sam o sobie dał znać w postaci błędnie działającej funkcjonalności po update’cie projektu do RTM) w EF Core 1.0 RTM, którego nie było we wcześniejszych wersjach tzn. RC1 i RC2.

Skip()’ując query nie includuje się lista z obiektami powiązanymi relacją

W moim przypadku jest to relacja 1 do wielu. W wolnym czasie sprawdzę jak jest z innymi, ale na razie skupmy się na wyżej wspomnianej.

Dla testów stworzyłem sobie całkiem nową aplikację aby mieć pewność, że to nie jakieś zaszłości z poprzednich wersji framework’a akurat u mnie w projekcie. Dodałem dwie klaski powiązane relacją:

classes

Zapisałem kilkadziesiąt rekordów przy czym każdy obiekt FirstModel powiązałem z 10cioma obiektami SecondClass.

Pytając o wszystkie i includując powiązaną tabelkę wszystko jest ok:

without

without_deb

 

Jednak kiedy zrobimy Skip()’a na query przed wykonaniem to lista z powiązanymi obiektami jest pusta:

skip

skip_deb

Ale jaja, nie? I to w RTM. Ciekawe ile jest jeszcze takich kwiatków.

Jakbyś był ciekaw co z dalej będzie z tym tematem to założyłem issue na github’ie.

Pjona!

 

Reklamy

Asp.Net Core 1.0 – camel case domyślnym formatowaniem Jsona w Mvc.

Siemanko.

W wersjach RC (Rc1 i Rc2) przy zwracaniu danych z API (mvc) zserializowanych do jsona za pomocą metody:

Json()

obiekty były (defaultowo) formatowane bez zmian wielkości liter w nazwach

2

4

W wersji RTM defaultowym ustawieniem formatowania jest camel case:

2

1.png

Jeśli rozwijacie projekt od wersji RC i planujecie go przenieść na wersję RTM to może Wam to zajebiście namieszać 🙂 Jednak niech będą spokojne Wasze rozczochrane – wujcio ma rozwiązanie ;). W klasie Sturtup.cs w metodzie ConfigureServices, w miejscu gdzie macie dodane Mvc należy troszkę dopisać do tej linijki:

3

Od teraz będzie wszystko po staremu:

2

4

Pjona!

Asp.Net Core – o migracji z RC1 do RC2 słów kilka.

Siemanko.

Dziś kilka wskazówek jak podejść do próby migracji projektu z wersji RC1 do RC2. Celowo napisałem „próby” ponieważ nie ma pewności, że Ci się to uda 😉 Wszystko zależy od struktury Twojego projektu oraz od Twojej odporności na dziwne błędy uniemożliwiające kompilację, które nie są zgłaszane przez IDE. Subiektywnie podzieliłem operacje migracji na dwa przypadki:

  • kiedy masz tylko web application
  • kiedy masz web application z referencjami do class library packages

Oczywiście musisz mieć zainstalowany .NET Core. Możesz to zrobić instalując update w Visual Studio lub pobierając go tutaj.

Samo Web Application

W wersji RC1 web application było jednym template’em.

3

Template web application w wersji RC1

Na poziomie tworzenia należało wskazać czy ma to być aplikacji Asp.Net 5 czy poprzednia

4

Następnie w pliku project.json należało wskazać runtime (clr lub coreclr, lub oba).

W wersji RC2 mamy dwa template’y web application – jeden dla .NETu, a drugi cross platform

2

Proponuję Ci utworzyć odpowiedni template (jeśli w Twoja aplikacja RC1 jest cross platform i korzysta z dnxcore to wybierz .NET Core, jeśli z samego dnxa to .NET Framework). Przejdź do pliku global.json nowo utworzonej solucji, skopiuj sdk version i wklej w to samo miejsce w swoim projekcie RC1.

1.png

global.json w wersji RC1

 

 

1

global.json w wersji RC2

Oczywiście wersja sdk 1.0.0-preview1-002702 w RC2 jest taka na dzień pisania posta.

Przejdź do katalogu C:\Users\nazwa_usera i skasuj folder .dnx. Tak, skasuj. Dnxa już nie ma i wszystko co jest w tym folderze już nie jest potrzebne, a może tylko generować jakieś trudności.

Dostosuj swój project.json do tego, który jest w wygenerowanym nowym szablonie i zacznij zmieniać namespace’y paczek w sekcji dependencies. Tutaj musisz zdawać się na IDE i błędy, które zgłasza (np. namespace’y z AspNet trzeba zmienić na AspNetCore itp.). Jak już uda Ci się doprowadzić error list do pustki to przejdź do package manager console, a w nim do folderu aplikacji i wpisz dotnet restore. Powinny zacząć pobierać się wszystkie paczki nugetowe. Reaguj na błędy, restoruj paczki i tak w kółko do skutku 🙂 Zamknięcie Visuala i ponowne otwarcie jest jak najbardziej wskazane 😉

Web Application z referencjami do class library packages

Tu już jest gorzej ponieważ w RC2 nie ma tego wynalazku – class library package z niebieską ikonką i plikiem project.json

1.png

Class library dla Asp.Net Core w wersji RC1

Teraz mamy normalne „zielone” class library

1

Class library w wersji Asp.Net Core RC2

Jak widać na zdjęciu mamy także dwa typy class library – dla .NET Core i dla .NET Framework. Aby nasz projekt zabanglał w RC2 to niestety musimy utworzyć całkiem nowe class library i pokopiować do nich klasy oraz dodać wszystkie paczki nugetowe przez Nuget Package Manager (w poprzedniej wersji można to było zrobić w pliku project.json). Należy pamiętać aby zaznaczyć ckeckbox Include prerelease podczas wyszukiwania paczek.

Podsumowanie

Życzę Ci powodzenia i wytrwałości. Pamiętaj jednak, że zawsze możesz utworzyć całą solucję od nowa i pokopiować pliki, albo po prostu rzucić to wszystko i wyjechać w Bieszczady 😉

Pjona!

„Hub could not be resolved” czyli kwiatuszki w Asp.Net Core RC2

Siemanko.

Całkiem nie dawno pisałem o tym, że udało mi się przejść na wersję RC2 frameworka Asp.Net Core. Wersję, której żywot określono na krótko bo pod koniec czerwca ma wyjść już RTM. Z tego względu wydawałoby się, że jest to już dopieszczona wersja i wszystko jest w niej cacy… ale niestety.

Problemy z SignalR

W wersji RC1, w moim projekcie zacząłem się już komunikować poprzez SignalR między apką mobilną, a serwerem. Po upgrade’dzie projektu do wersji RC2 po chwilce przerwy przysiadłem znowu do pracy i ku mojemu zdziwieniu po próbie połączenia się apki z serwerem aplikacja mobilna się wywalała. Zapewne znasz to uczucie gdy nie zmieniłeś choć jednej linijki kodu, IDE nie sypie errorami, a coś co działało jeszcze wczoraj z niewiadomych przyczyn przestało. Po kilku godzinach prób zacząłem debugowanko na serwerze. W Sturtup.cs przed deklaracją SignalR zamieściłem kilka linijek kodu aby następne wywołanie na pipeline złapać w try catch:

1

Zacząłem googlować i doklikałem się do issue na githubie. Otóż w wersji RC2 popsuto coś co działało w RC1 😉

Workaround

Gość na githubie podsunął mi tymczasowe rozwiązanie. Otóż bug jest w klasie DefaultAssemblyLocator.cs, który został już poprawiony, ale znajduje się w paczce RC3 z referencjami do inncyh paczek RC3, które zarazem będą się gryzły z RC2Skopiowałem kod tej klasy i umieściłem go w swoim projekcie w nowo utworzonej klasie o nazwie HubCouldNotBeResolvedWorkaround (możesz nazwać jak chcesz). W Sturtup.cs w metodzie ConfigureServices tuż przed wywołaniem

services.AddSignalR();

należy umieścić linijkę 

services.AddSingleton<IAssemblyLocator, HubCouldNotBeResolvedWorkaround>();

Ten kod oznacza ni mniej ni więcej jak dla każdej zależności IAssemblyLocator wstrzyknij obiekt HubCouldNotBeResolvedWorkaround, który ma być singletonem w ramach całej aplikacji. W ten sposób IAssemblyLocator  z paczki SignalR RC2 z bugiem został zastąpiony poprawionym z wersji RC3 bez konieczności upgrade’u całego projektu do RC3 (która jest tylko na deweloperskich serwerach Nuget)

Podsumowanie

Mam nadzieje, że dzięki temu wpisowi zaoszczędzisz kilka godzin na kminienie co może być nie tak – tak jak ja.

Pjona!

DSP 2016 – Grande Finale! Nieco spóźnione podsumowanie uczestnictwa w konkursie.

Siemanko.

Pierwszego czerwca zakończył się konkurs Maćka Aniserowicza „Daj się poznać 2016”. Do uczestnictwa w tym przedsięwzięciu powstało/reaktywowało się/dołączyło ok 300 blogów. Ten blog należy do grona nowo powstałych i zarazem tych, które dotrwały do końca regulaminowego czasu trwania konkursu. Także jestem w „finałowej” 70-tce. Choć o zakwalifikowaniu się do finału nie decydowała wartość merytoryczna postów, ani efekt końcowy rozwijanego projektu to systematyczna praca przez 10 tygodni okazała się nie lada wyzwaniem (co widać po stosunku ilości blogów na starcie do blogów na mecie). Ja choć nie ukończyłem mojego projektu konkursowego to i tak jestem zadowolony ze stanu w jakim się teraz znajduje. Przed rozpoczęciem nad nim prac nie zakładałem, że uda mi się aż tyle zrobić przez kilkanaście godzin tygodniowo (przy czym mobilna deweloperka to była dla mnie zupełna nowość).

Blog

Do tej pory wordpress naliczył 1088 odsłon. Szablon mojego bloga jest tak skonstruowany, że wchodząc na stronę główną można przeczytać wszystkie posty tylko scroll’ując w dół, bez wklikiwania się w treści. Tym sobie tłumaczą taką małą ilość zarejestrowanych wejść 😉 Pod postami znalazło się łącznie 18 komentarzy (wraz z moimi odpowiedziami) dlatego mam namacalny dowód, że nie tylko roboty do indeksowania stron odwiedzały tego bloga 😉

2

Gościłem nawet zagraniczne osobistości (podejrzewam, że z USA byli to ludzie z centrali Google ;))

4

Kod

Trzy projekty:

  • Android Studio (przed przejściem na Xamarin’a)
  • AspNet Core 1.0
  • Xamarin Android

5

Aplikacja

Zrealizowane moduły:

  • rejestracja/logowanie (formularzowe i przez facebook’a)
  • autentykacja za pomoca tokena JWT
  • ustalanie lokalizacji
  • pobieranie i wyświetlanie listy ogłoszeń
  • wyświetlanie szczegółów ogłoszenia
  • tworzenie nowego ogłoszenia (z wykorzystaniem kamery)
  • komunikacja z serwerem przez SignalR (początki czatu)

Screeny:

WP_20160313_17_14_17_ProIMAG0037

13177393_1011632665583795_5778124407927892321_nIMAG0041

IMAG0047IMAG0061

2

IMAG0082

Głosy

Do 7 czerwca wszyscy uczestnicy mogą oddawać głosy na trzy wg. nich najfajniesze blogi. Po tym czasie 15 blogów z największą ilością głosów przechodzi do wielkiego finału gdzie głosować będą mogli wszyscy. Także nie bądź zaskoczony/a jeśli zaczniesz dostawać spam z prośbą o głosy od swoich znajomych 😉 Przyznam szczerze, że nie miałem czasu na to aby śledzić inne blogi jednak zagłosowałem na te, na które od czasu do czasu pozwoliłem sobie zajrzeć i mi przypasowały 😉

Programistka – projekt aplikacji na androida także bliski mi temat. Wydaje mi się, że zaglądaliśmy do siebie

Na miękko – temat projektu bliski mojemu i podobne poczucie humoru

Itcraftsman – już przed konkursem miałem go w „polubionych”. Podoba mi się za profesjonalizm.

Do nich poleciały moje głosy i życzę im powodzenia!

Podsumowanie

To były uczciwie przepracowane prawie 3 miesiące. Gratuluję każdemu kto dotrwał do końca,  a także tym, którzy z jakiegoś powodu musieli przerwać uczestnictwo w konkursie. Dziękuję mojej kochanej narzeczonej za wyrozumiałość i uśmiech przez zęby kiedy każdy wolny weekend spędzałem przy komputerze 😉

Pjona!