.net Core / c# / Entity Framework / MariaDB / problemiki

MariaDB i EntityFramework .Net Core

W firmie podjęto decyzję, że nie kupujemy nowego MS SQL Servera, a poprzedni ma już 11 lat (2008 R2). SQL Express odpada, bo jego plik to maksymalnie 10GB (czyli tyle samo co 2008 R2), a my potrzebujemy więcej miejsca na dane.

Wybór padł na MariaDB. Bo jest darmowy, bo jest „świeży”, bo wywodzi się MySQL, bo można w niego zapakować 64TB danych, bo jest oprogramowaniem otwartym i jest rozwijany (co nie znaczy, że MS SQL nie jest) …

… bo dlaczego nie spróbować?

Aplikację mam w .NET Core 2.1 i zacząłem od instalacji Pomelo.EntityFrameworkCore.MySql Nie było łatwo, bo wybrałem niewłaściwą wersję i skutkowało niemożliwością zaktualizowania jakiejś kryptograficznej dll’ki. Po pół godziny miałem już aplikację zmigrowaną do .NET Core 2.2, a więc całe zajście odnotowuje na plus. Działa, znaczy się kompiluje ;).

To teraz czas zainstalować MariaDB. Instralacja jest prosta i nie boli. Warto pamiętać, aby zaznaczyć checkbox ustawiający UTF8 jako domyślny zestaw znakowy serwera.

Niestety narzędzie jakim jest HeidiSQL na pierwszy rzut oka zdaje się być topornym w porównaniu do SQL Studio Management, ale jak się nie ma co się lubi to się człowiek przyzwyczai. A może to właśnie kwestia przyzwyczajenia?

MariaDB zainstalowana, a więc czas uruchomić aplikację tak, aby potrafiła się z Marysią dogadać. Zaczynam od klasy DesignTimeDbContextFactory IDesignTimeDbContextFactory<> ponieważ całą obsługę wyniosłem do oddzielnego projektu. Tutaj należy zamienić linijkę

builder.UseSqlServer(connectionString);

na

builder.UseMySql(connectionString) 

Podobną rzecz muszę zrobić w Startup.cs, czyli linijkę:

services.AddDbContext(options => options.UseLazyLoadingProxies().UseMySql(Configuration.GetConnectionString("DefaultConnection"), x =>; x.MigrationsAssembly("Namespace"))); 

zmieniam na:

services.AddDbContext(options => options.UseLazyLoadingProxies().UseMySql(
Configuration.GetConnectionString("DefaultConnection"), x => x.MigrationsAssembly("Namespace")));

Do tego zmieniam connectionString na właściwy dla bazy danych w MariaDB i powinno działać.
Wykonuję Update-Database i baza jest utworzona.

Ale to nie koniec przygód. O ile tabel, w których kluczem jest pole z Guidem działają poprawnie i insert danych jest przeprowadzany bez żadnego problemu, o tyle autoinkrementowane pola typu int po prostu nie są obsługiwane przez Pomalo od czego niestety rozbolała mnie głowa.

Po dłuższym eksplorowaniu internetu i własnym doświadczeniu pojawiły się następujące wnioski:
1. Przed Update-Database należy w konfiguracji wszystkich modeli gdzie jest autoinkrementowalny klucz dopisać linijkę:

modelBuilder.Entity&lt;Type&gt;().Property(x =&gt; x.Id).HasAnnotation(&quot;MySql:ValueGenerationStrategy&quot;, MySqlValueGenerationStrategy.IdentityColumn) .ValueGeneratedOnAdd();

2. Jeżeli już zrobiliśmy Update-Database bez wykonania czynności z punktu pierwszego to należy przespacerować się po bazie i zmienić to ustawienie we wszystkich tabelach ręcznie.
3. Jak ktoś przetrenował punkt 1 i zadziałało to proszę o komentarz, bo już nie chciało mi się sprawdzać :).

Po tym wszystkim zaczęło wszystko działać jak malowane.

Leave a Reply

Your email address will not be published. Required fields are marked *

© 2019 ohdev.net | WordPress Theme: Cosimo by CrestaProject.