Veri Çekirdeği Oluşturma

Veri dengeli dağıtımı, bir veritabanını ilk veri kümesiyle doldurma işlemidir.

EF Core ' de gerçekleştirebilmenin birkaç yolu vardır:

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

Temel verileri modelleyin

EF6 'in aksine, EF Core, dengeli dağıtım verileri model yapılandırmasının bir parçası olarak bir varlık türüyle ilişkilendirilebilir. Daha sonra EF Core geçişler , veritabanının yeni bir sürümüne yükseltilirken ekleme, güncelleştirme veya silme işlemlerinin uygulanması gerektiğini otomatik olarak hesaplar.

Not

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

Örnek olarak, bu, içindeki için çekirdek verileri yapılandırır BlogOnModelCreating :

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

İlişkiye sahip varlıkları eklemek için yabancı anahtar değerleri belirtilmelidir:

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 olan varlık türleri benzer bir biçimde çalıştırı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 bkz. tam örnek proje .

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

İpucu

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

Alternatif olarak, context.Database.EnsureCreated() çekirdek verileri içeren yeni bir veritabanı oluşturmak için kullanabilirsiniz (örneğin, bir test veritabanı veya bellek içi sağlayıcıyı veya hiçbir ilişki dışı veritabanını kullanırken). Veritabanı zaten varsa, EnsureCreated() şemayı veya veritabanındaki çekirdek verileri güncelleştirmediğini unutmayın. Geçiş kullanmayı planlıyorsanız, ilişkisel veritabanları için ' i çağırmalısınız EnsureCreated() .

Model tohum verilerinin sınırlamaları

Bu tür çekirdek verileri geçişlerle yönetilir ve veritabanında zaten var olan verileri güncelleştirmek için betik veritabanına bağlanmadan oluşturulmalıdır. Bu, bazı kısıtlamalar getirir:

  • Birincil anahtar değerinin, genellikle veritabanı tarafından oluşturulsa bile belirtilmesi gerekir. Geçişler arasındaki veri değişikliklerini algılamak için kullanılacaktır.
  • Önceden sağlanan veriler, birincil anahtar herhangi bir şekilde değiştirilirse kaldırılır.

Bu nedenle, bu özellik, geçiş dışında değiştirilmesi beklenen statik veriler için en yararlı seçenektir ve örneğin ZIP kodları gibi veritabanında başka herhangi bir şeye bağlı 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 olan veriler (dağıtım anlık görüntülerinde veri dağıtımı verileri yakalanır ve büyük veriler çok büyük dosyalara hızla ve performans düşüklüğü oluşmasına neden olabilir).
  • Kimlik olarak alternatif anahtarlar kullanan varlıklar dahil olmak üzere, veritabanı tarafından oluşturulacak anahtar değerlere ihtiyacı olan veriler
  • Bazı Parola karması gibi özel dönüşüm gerektiren ( değer dönüştürmeleritarafından işlenmemiş) veriler
  • ASP.NET Core kimlik rolleri ve kullanıcı oluşturma gibi dış apı çağrıları gerektiren veriler

El ile geçiş özelleştirmesi

Bir geçiş eklendiğinde, ile belirtilen verilere yapılan değişiklikler HasData ,, ve çağrılarına dönüştürülür InsertData()UpdateData()DeleteData() . HasDataBu çağrıları veya HasData bunun yerine geçiş yöntemine el ile eklemek, ' nin bazı sınırlamalarıyla ilgili bir yoldur.

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

Özel başlatma mantığı

Veri dengeli dağıtımı yapmanın basit ve güçlü bir yolu, DbContext.SaveChanges() ana uygulama mantığı yürütmeye başlamadan önce kullanılır.

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ı

Dağıtım kodu, birden çok örnek çalışırken eşzamanlılık sorunlarına yol açacağından ve ayrıca uygulamanın veritabanı şemasını değiştirme izni olmasını gerektirdiğinde, 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ı yollarla yürütülebilir:

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

Bu, genellikle Yayımlama profillerikullanılarak otomatikleştirilebilir.