Wstępne wypełnianie danych

Zasiewanie danych to proces wypełniania bazy danych początkowym zestawem danych.

Istnieje kilka sposobów, na które można to zrobić w programie EF Core:

  • Dane inicjuj modelu
  • Ręczne dostosowywanie migracji
  • Niestandardowa logika inicjowania

Dane inicjuj modelu

W przeciwieństwie do programu EF6 w programie EF Core dane rozmieszczania mogą być skojarzone z typem jednostki w ramach konfiguracji modelu. Następnie migracje platformy EF Core mogą automatycznie obliczać, jakie operacje wstawiania, aktualizowania lub usuwania muszą być stosowane podczas uaktualniania bazy danych do nowej wersji modelu.

Uwaga

Migracje uwzględniają tylko zmiany modelu podczas określania, jaką operację należy wykonać, aby pobrać dane inicjujące do żądanego stanu. W związku z tym wszelkie zmiany danych wykonywane poza migracjami mogą zostać utracone lub spowodować błąd.

Na przykład spowoduje to skonfigurowanie danych inicjujnych dla elementu Blog w OnModelCreatingprogramie :

modelBuilder.Entity<Blog>().HasData(new Blog { BlogId = 1, Url = "http://sample.com" });

Aby dodać jednostki, które mają relację, należy określić wartości klucza obcego:

modelBuilder.Entity<Post>().HasData(
    new Post { BlogId = 1, PostId = 1, Title = "First post", Content = "Test 1" });

Jeśli typ jednostki ma jakiekolwiek właściwości w stanie w tle, można użyć klasy anonimowej do podania wartości:

modelBuilder.Entity<Post>().HasData(
    new { BlogId = 1, PostId = 2, Title = "Second post", Content = "Test 2" });

Typy jednostek należących do użytkownika mogą być rozmieszczane w podobny sposób:

modelBuilder.Entity<Post>().OwnsOne(p => p.AuthorName).HasData(
    new { PostId = 1, First = "Andriy", Last = "Svyryd" },
    new { PostId = 2, First = "Diego", Last = "Vega" });

Zobacz pełny przykładowy projekt, aby uzyskać więcej kontekstu.

Po dodaniu danych do modelu należy użyć migracji w celu zastosowania zmian.

Napiwek

Jeśli musisz zastosować migracje w ramach zautomatyzowanego wdrożenia, możesz utworzyć skrypt SQL, który można wyświetlić przed wykonaniem podglądu.

Alternatywnie możesz użyć context.Database.EnsureCreated() polecenia , aby utworzyć nową bazę danych zawierającą dane inicjujące, na przykład dla testowej bazy danych lub w przypadku korzystania z dostawcy w pamięci lub dowolnej nierelacyjnej bazy danych. Należy pamiętać, że jeśli baza danych już istnieje, EnsureCreated() nie zaktualizuje schematu ani danych inicjujących w bazie danych. W przypadku relacyjnych baz danych nie należy wywoływać EnsureCreated() , jeśli planujesz używać migracji.

Ograniczenia danych inicjowania modelu

Ten typ danych inicjujących jest zarządzany przez migracje i skrypt w celu zaktualizowania danych, które są już w bazie danych, należy wygenerować bez nawiązywania połączenia z bazą danych. Nakłada to pewne ograniczenia:

  • Wartość klucza podstawowego musi być określona, nawet jeśli jest ona zwykle generowana przez bazę danych. Będzie on używany do wykrywania zmian danych między migracjami.
  • Wcześniej rozstawione dane zostaną usunięte, jeśli klucz podstawowy zostanie zmieniony w jakikolwiek sposób.

W związku z tym ta funkcja jest najbardziej przydatna w przypadku danych statycznych, które nie powinny zmieniać się poza migracjami i nie zależą od niczego innego w bazie danych, na przykład kodów POCZTOWYCH.

Jeśli twój scenariusz zawiera dowolną z następujących czynności, zaleca się użycie niestandardowej logiki inicjowania opisanej w ostatniej sekcji:

  • Tymczasowe dane do testowania
  • Dane zależne od stanu bazy danych
  • Dane, które są duże (rozmieszczanie danych jest przechwytywane w migawkach migracji, a duże dane mogą szybko prowadzić do ogromnych plików i obniżonej wydajności).
  • Dane, które wymagają wygenerowania przez bazę danych wartości kluczy, w tym jednostek używających kluczy alternatywnych jako tożsamości
  • Dane wymagające przekształcenia niestandardowego (które nie są obsługiwane przez konwersje wartości), takie jak skróty haseł
  • Dane wymagające wywołań zewnętrznego interfejsu API, takich jak ASP.NET role tożsamości podstawowej i tworzenie użytkowników

Ręczne dostosowywanie migracji

Po dodaniu migracji zmiany w danych określonych za HasData pomocą są przekształcane w wywołania metody InsertData(), UpdateData()i DeleteData(). Jednym ze sposobów obejścia niektórych ograniczeń jest HasData ręczne dodanie tych wywołań lub operacji niestandardowych do migracji.

migrationBuilder.InsertData(
    table: "Blogs",
    columns: new[] { "Url" },
    values: new object[] { "http://generated.com" });

Niestandardowa logika inicjowania

Prostym i zaawansowanym sposobem wykonywania rozmieszczania danych jest użycie DbContext.SaveChanges() przed rozpoczęciem wykonywania głównej logiki aplikacji.

using (var context = new DataSeedingContext())
{
    context.Database.EnsureCreated();

    var testBlog = context.Blogs.FirstOrDefault(b => b.Url == "http://test.com");
    if (testBlog == null)
    {
        context.Blogs.Add(new Blog { Url = "http://test.com" });
    }

    context.SaveChanges();
}

Ostrzeżenie

Kod inicjujący nie powinien być częścią normalnego wykonywania aplikacji, ponieważ może to spowodować problemy ze współbieżnością, gdy uruchomiono wiele wystąpień i wymagałoby również, aby aplikacja miała uprawnienia do modyfikowania schematu bazy danych.

W zależności od ograniczeń wdrożenia kod inicjowania może być wykonywany na różne sposoby:

  • Lokalne uruchamianie aplikacji inicjalizacji
  • Wdrażanie aplikacji inicjowania przy użyciu głównej aplikacji, wywoływanie procedury inicjowania i wyłączanie lub usuwanie aplikacji inicjowania.

Zazwyczaj można to zautomatyzować przy użyciu profilów publikowania.