Projektowanie bazy danych – Code First

3 minutesTworzenie bazy danych wymaga od nas przemyślenia struktury tabel i relacji oraz zaprojektowania jej w sposób optymalny. Entity Framework oferuje trzy podejścia:  
  • CodeFirst;
  • Database First;
  • Model First.
  Ja wybrałem podejście CodeFirst. Podejście to jest moim zdaniem optymalne w naszym projekcie, ponieważ:  
  • Nie lubię używać designerówi definiować mapowań EDMX ;
  • Pełna kontrola nad kodem (nie jest to kod wygenerowany, który jest trudny w zarządzaniu).
  • Nie musimy się martwić bazą danych. Baza danych służy tylko do przechowywania danych i nie zawiera logiki,
  • Wersje bazy danych. Możemy migrować pomiędzy wersjami bazy danych (ułatwia nam to szczególnie git cofamy się do wybranego punktu i odtwarzamy wcześniejszą bazę danych). Takie podejście jest bardzo elastyczne i nie marnujemy czasu na przywracanie bazy z kopi lub pliku sql (tylko struktura jak chcemy mieć dane domyślne używamy do tego metody OnModelCreating z klasy ApplicationDbContext ).
Pamiętajmy, żeby nie zmieniać struktury bazy danych ręcznie tylko przez migrację po uprzedniej zmianie w klasach poco lub w klasie ApplicationDbContext. Do autoryzacji użytkowników użyłem klasy Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUser. Rozwiązanie to pozwoli mi uzyskać funkcjonalność dostępu do aplikacji bez tworzenia własnej struktury bazy jak i kontrolera oraz widoków w projekcie TooExe.Owl.Mvc. Dobrą praktyka jest tworzenie własnej bazy w oddzielnym schemacie (schema). Uzyskujemy to za pomocą atrybutu:
[Table("KnownWords", Schema = "Owl")]
public class KnownWord
{
   [Key]
    public int Id { get; set; }

    public int IdTranslation { get; set; }
    public int IdOwlUser  { get; set; }
    [ForeignKey("IdOwlUser")]
    public virtual OwlUser OwlUser { get; set; }
    [ForeignKey("IdTranslation")]
    public virtual Translation Translation { get; set; }
 }
Po utworzeniu class poco w klasie ApplicationDbContext wpisujemy właściwości:
public DbSet<Article>Articles { get; set; }
public DbSet<ArticleDetail> ArticleDetails { get; set; }
public DbSet<EnglishWord> EnglishWords { get; set; }
public DbSet<KnownWord> KnownWords { get; set; }
public DbSet<PlayList> PlayLists { get; set; }
public DbSet<PlayListDetail> PlayListDetails { get; set; }
public DbSet<PolishWord>; PolishWords { get; set; }
public DbSet<Translation> Translations { get; set; }
public DbSet<OwlUser> OwlUser { get; set; }
Po kompilacji przechodzimy do konsoli nugeta wybieramy domyślny projekt TooExe.Owl.Mvc (w Solution explorer ustawiamy ten sam domyślny projekt) i wpisujemy Add-Migration NazwaAktualnegoPunktuBazy (np. DodaniePolaAdres) po dodaniu aktualizujemy bazę danych poleceniem Update-Database. Diagram bazy: Diagram ASP .NET Identity: Dzięki podejściu CodeFirst będziemy mogli szybko zmodyfikować bazę danych w zależności od przyszłych funkcjonalności. Oczywiście jeżeli system byłby w wersji produkcyjnej i jego wydajność miała by być priorytetem to zastosował bym podejście Database First, oraz nie była by to baza danych relacyjna. Należało by rozważyć zastosowanie bazy noSQL, ale to już nie w naszym projekcie, który jest projektem proof of technology.