Veri Çekirdeği Oluşturma

Veri tohumlama, bir veritabanını başlangıç veri kümesiyle doldurma işlemidir.

Bunun EF Core'da gerçekleştirilmesinin birkaç yolu vardır:

  • Model tohumu verileri
  • El ile geçiş özelleştirmesi
  • Özel başlatma mantığı

Model tohumu verileri

EF6'nın aksine EF Core'da, çekirdek oluşturma verileri model yapılandırmasının bir parçası olarak bir varlık türüyle ilişkilendirilebilir. Ardından EF Core geçişleri , veritabanını modelin yeni bir sürümüne yükseltirken hangi ekleme, güncelleştirme veya silme işlemlerinin uygulanması gerektiğini otomatik olarak hesaplayabilir.

Dekont

Geçişler, yalnızca tohum verilerini istenen duruma getirmek için hangi işlemin gerçekleştirilmesi gerektiğini belirlerken model değişikliklerini dikkate alır. Bu nedenle, geçişler dışında gerçekleştirilen verilerde yapılan değişiklikler kaybolabilir veya bir hataya neden olabilir.

Örneğin, bu, içindeki OnModelCreatingiçin Blog tohum verilerini yapılandıracaktır:

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

İlişkisi olan varlıkları eklemek için yabancı anahtar değerlerinin belirtilmesi gerekir:

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

Varlık türünün gölge durumunda herhangi bir özelliği varsa, değerleri sağlamak için anonim bir sınıf kullanılabilir:

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

Sahip olunan varlık türleri benzer şekilde dağıtılabilir:

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

Daha fazla bağlam için örnek projenin tamamına bakın.

Veriler modele eklendikten sonra, değişiklikleri uygulamak için geçişler kullanılmalıdır.

Bahşiş

Geçişleri otomatik bir dağıtımın parçası olarak uygulamanız gerekiyorsa, yürütmeden önce önizlenebilen bir SQL betiği oluşturabilirsiniz.

Alternatif olarak, örneğin bir test veritabanı veya bellek içi sağlayıcıyı veya ilişkisel olmayan herhangi bir veritabanını kullanırken, tohum verilerini içeren yeni bir veritabanı oluşturmak için kullanabilirsiniz context.Database.EnsureCreated() . Veritabanı zaten varsa, EnsureCreated() veritabanındaki şemayı veya tohum verilerini güncelleştirmez. geçişleri kullanmayı planlıyorsanız ilişkisel veritabanları için aramamanız EnsureCreated() gerekir.

Model tohumu verilerinin sınırlamaları

Bu tür tohum verileri geçişler tarafından yönetilir ve veritabanında zaten bulunan verilerin veritabanına bağlanmadan oluşturulması gereken verileri güncelleştirmek için betik oluşturulur. Bu, bazı kısıtlamalar uygular:

  • Birincil anahtar değeri genellikle veritabanı tarafından oluşturulmuş olsa bile belirtilmelidir. Geçişler arasındaki veri değişikliklerini algılamak için kullanılır.
  • Birincil anahtar herhangi bir şekilde değiştirilirse önceden dağıtılan veriler kaldırılır.

Bu nedenle, bu özellik en çok geçişler dışında değişmesi beklenmeyen statik veriler için kullanışlıdır ve veritabanındaki posta kodları gibi başka hiçbir şeye bağımlı değildir.

Senaryonuz aşağıdakilerden birini içeriyorsa, son bölümde açıklanan özel başlatma mantığını kullanmanız önerilir:

  • Test için geçici veriler
  • Veritabanı durumuna bağlı veriler
  • Büyük veriler (çekirdek oluşturma verileri geçiş anlık görüntülerinde yakalanır ve büyük veriler hızla büyük dosyalara ve düşük performansa yol açabilir).
  • Veritabanı tarafından anahtar değerlerinin oluşturulmasını gerektiren veriler( kimlik olarak alternatif anahtar kullanan varlıklar da dahil)
  • Bazı parola karması gibi özel dönüştürme gerektiren veriler (değer dönüştürmeleri tarafından işlenmez)
  • ASP.NET Çekirdek Kimlik rolleri ve kullanıcı oluşturma gibi dış API'ye çağrı gerektiren veriler

El ile geçiş özelleştirmesi

Geçiş eklendiğinde, ile HasData belirtilen verilerde yapılan değişiklikler , UpdateData()ve DeleteData()çağrılarına InsertData()dönüştürülür. Sınırlamalardan bazılarını geçici olarak gidermenin bir yolu, geçişe bu çağrıları HasData veya özel işlemleri el ile eklemektir.

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

Özel başlatma mantığı

Veri tohumlama gerçekleştirmenin basit ve güçlü bir yolu, ana uygulama mantığı yürütülmeye başlamadan önce kullanmaktır DbContext.SaveChanges() .

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();
}

Uyarı

Birden çok örnek çalışırken eşzamanlılık sorunlarına neden olabileceğinden ve uygulamanın veritabanı şemasını değiştirme iznine sahip olmasını gerektireeceğinden, tohumlama kodu normal uygulama yürütmesinin parçası olmamalıdır.

Dağıtımınızın kısıtlamalarına bağlı olarak başlatma kodu farklı şekillerde yürütülebilir:

  • Başlatma uygulamasını yerel olarak çalıştırma
  • Başlatma uygulamasını ana uygulamayla dağıtma, başlatma yordamını çağırma ve başlatma uygulamasını devre dışı bırakma veya kaldırma.

Bu genellikle yayımlama profilleri kullanılarak otomatikleştirilebilir.