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 OnModelCreating
iç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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin