{"componentChunkName":"component---src-templates-blog-post-js","path":"/blog/migracja-z-net-core-2-2-do-3-1","result":{"data":{"markdownRemark":{"html":"<p>W wersjach .NET Core można się nie łapać - co jakiś wychodzą nowe, nie zawsze wiadomo, czy i kiedy przenosić się na nowsze wersje oraz jakie będą tego skutki. (Osoby ze świata \"starego\" .NETa pamiętają, że to nigdy nie była prosta decyzja.) Z pomocą przychodzi jednak sam Microsoft, mówiąc wprost, jakie wersje wspiera, a jakie już skazuje na zapomnienie. Stan na dzisiaj:</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/039eaa8184de388814481b7bae313b19/53639/20200317-netcore-31.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 32.43243243243243%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAA+0lEQVQY0z1P2U7DMBDM/38HX4GQeENIRRRKShENDyBok8Yhh72HndjLJpGwxtZojpU3q+veAbMPxArPIZrT3vUX9vFcXUzT+jA1v93PqRoscJj0VVkr3o+Zqwqoc2yep2Ev8CpcfO+uuLwVOqJ5DN2L4BuYrULwIHAY+5zb3ZzE98x1A/S9TDaNikGEvu7v4PMoAh5biU4ttDU5M/PoCIz+K2l+cpmzkTCJiN6UZlLmOZ5LZcwhLToS60ayHF0QkFc9G9rghnEpphSj2v31jd08zGWduowDAERcy0RkrV3SKUM3McXVkCVqt09UfCjx3v8XiHjlKiLSyv8ALdRXiV7n+9QAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Lista wersji .NET Core SDK wraz z datami zakończenia wsparcia\"\n        title=\"Lista wersji .NET Core SDK wraz z datami zakończenia wsparcia\"\n        src=\"/static/039eaa8184de388814481b7bae313b19/fcda8/20200317-netcore-31.png\"\n        srcset=\"/static/039eaa8184de388814481b7bae313b19/12f09/20200317-netcore-31.png 148w,\n/static/039eaa8184de388814481b7bae313b19/e4a3f/20200317-netcore-31.png 295w,\n/static/039eaa8184de388814481b7bae313b19/fcda8/20200317-netcore-31.png 590w,\n/static/039eaa8184de388814481b7bae313b19/efc66/20200317-netcore-31.png 885w,\n/static/039eaa8184de388814481b7bae313b19/c83ae/20200317-netcore-31.png 1180w,\n/static/039eaa8184de388814481b7bae313b19/53639/20200317-netcore-31.png 1358w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<p>Gdy ze zdziwieniem spostrzegłem, że wersja 2.2, na której oparty był ostatni projekt, w którym pracowałem - nie jest już wspierana od Bożego Narodzenia 2019, zaordynowałem przenosiny na 3.1. To jest wersja rekomendowana i będzie wspierana przez najbliższe 2 lata. Jak dla mnie spoko.</p>\n<p>No to myślę sobie, że zmieniam w csprojach tylko jedną linijkę:</p>\n<div class=\"gatsby-highlight\" data-language=\"xml\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-xml line-numbers\"><code class=\"language-xml\"> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>TargetFramework</span><span class=\"token punctuation\">></span></span>netcoreapp3.1<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>TargetFramework</span><span class=\"token punctuation\">></span></span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>...i fajrant. 😎</p>\n<p>To jednak nie jest takie proste. Poniżej przedstawiam listę kolejnych kroków, które trzeba zrobić.</p>\n<ol>\n<li>Podbij wersję w csprojach jak wyżej.</li>\n<li>Po skompilowaniu dostaniesz na pewno błędy z informacją o konieczności usunięcia referencji do niektórych nugetów lub podbcia wersji. Ja musiałem m.in.:</li>\n<li>usunąć referencję do <code class=\"language-text\">Microsoft.AspNetCore.App</code> z projektu WebAPI,</li>\n<li>podbić wersję <code class=\"language-text\">Microsoft.Extensions.DependencyInjection</code> do <code class=\"language-text\">3.1.x</code></li>\n<li>Zrób parę modyfikacji w <code class=\"language-text\">Startup.cs</code> (to jest przykład dla projektu WebAPI, bez żadnych widoków czy Razor pages):</li>\n<li>dodaj <code class=\"language-text\">services.AddControllers();</code> na początku <code class=\"language-text\">ConfigureServices</code>,</li>\n<li>zmień <code class=\"language-text\">CompatibilityVersion</code> na <code class=\"language-text\">Version_3_0</code> w <code class=\"language-text\">services.AddMvc(...).SetCompatibilityVersion(...)</code>,</li>\n<li>zamień użycie <code class=\"language-text\">IHostingEnvironment</code> na <code class=\"language-text\">IWebHostEnvironment</code> w argumentach metod,</li>\n<li>\n<p>w metodzie <code class=\"language-text\">Configure</code>:</p>\n<ul>\n<li>dodaj <code class=\"language-text\">app.UseRouting();</code> (raczej na początku),</li>\n<li>dodaj <code class=\"language-text\">app.UseAuthorization();</code> (o ile jest uwierzytelnianie w projekcie),</li>\n<li>dodaj na końcu:</li>\n</ul>\n</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-csharp line-numbers\"><code class=\"language-csharp\">app<span class=\"token punctuation\">.</span><span class=\"token function\">UseEndpoints</span><span class=\"token punctuation\">(</span>endpoints <span class=\"token operator\">=></span>\n<span class=\"token punctuation\">{</span>\n    endpoints<span class=\"token punctuation\">.</span><span class=\"token function\">MapControllers</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span></span></pre></div>\n<ol start=\"4\">\n<li>Potem podbij EF Core do 3.1 (oczywiście, jeśli jest używane w Twoim projekcie). Nie zapomnij też o podbiciu <code class=\"language-text\">Microsoft.EntityFrameworkDesign</code>, jeśli Twój kontekst jest w innym projekcie niż apka webowa.</li>\n<li>Jeśli masz testy Twoich repozytoriów (lub innego kodu czytającego coś bazy) - na pewno testy się wywalą. Chodzi tu o to, że w EF Core 3 została wprowadzona zasadnicza zmiana: w poprzedniej wersji EF Core tam, gdzie nie potrafił zbudować poprawnego, bardziej złożonego query - na chama wykonywał operację po stronie klienta (co skutkowało miejscami niespodziewanie niską wydajnością zapytań); w wersji 3 inżynierowie Microsoftu postanowili zrobić odwrotnie: tam, gdzie query byłoby w wersji 2 wykonane po stronie klienta, teraz framework rzuca wyjątek - i sugeruje, żeby zrobić tę kwerendę explicite po stronie klienta. Umownie można powiedzieć, że w tych miejscach trzeba dodać to przysłowiowe <code class=\"language-text\">ToList</code>, żeby najpierw dane ściągnąć do klienta.</li>\n<li>Jeśli sam utrzymujesz build maszynę, to czeka Cię jeszcze jedna niespodzianka - odpowiednie sparowanie wersji .NET Core SDK i EF Core CLI Tool. Tutaj też nastąpiła zmiana - otóż, dotychczas EF Core CLI Tool (czyli coś, co umożliwia pisanie <code class=\"language-text\">dotnet ef ...</code>) było częścią całego SDK. Teraz już tak nie jest i należy tego toola zainstalować oddzielnie. Żeby było jeszcze trudniej, wersja tego narzędzia musi być \"sparowana\" z wersją .NET Core SDK. U mnie zadziałał zestaw:</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-bash line-numbers\"><code class=\"language-bash\">dev@build-machine:~$ dotnet --version\n<span class=\"token number\">3.1</span>.102\ndev@build-machine:~$ dotnet-ef --version\nEntity Framework Core .NET Core Command-line Tools\n<span class=\"token number\">3.1</span>.1</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>To ważne, bo na ten moment najnowszą wersję EF Core CLI Tools jest 3.1.2, które nijak nie chce współgrać z .NET Core 3.1.102. Tak więc EF Core CLI Tool musi być zainstalowany z podaniem konkretnej wersji, a nie domyślnie.</p>\n<ol start=\"7\">\n<li>Po drodze jeszcze podbiłem wersję xUnit, ale już nie pamiętam, czy to było konieczne. :) (Ale wówczas trzeba też podbić <code class=\"language-text\">xunit.runner.visualstudio</code> i - chyba? - <code class=\"language-text\">Microsoft.NET.Test.Sdk</code> - żeby można było odpalać unit testy w Resharperze.)</li>\n</ol>","excerpt":"W wersjach .NET Core można się nie łapać - co jakiś wychodzą nowe, nie zawsze wiadomo, czy i kiedy przenosić się na nowsze wersje oraz jakie będą tego skutki…","frontmatter":{"date":"20 March, 2020","path":"/blog/migracja-z-net-core-2-2-do-3-1","title":"Migracja .NET Core 2.2 do 3.1"},"fields":{"readingTime":{"text":"3 min read"}}}},"pageContext":{}},"staticQueryHashes":["3649515864","63159454"]}