En hızlı Varlık olarak Ekleme Yolu Çerçevesi
Varlık Çerçevesi eklemek için en hızlı yol arıyorum, etkin bir Current olduğu senaryo nedeniyle bu soruyorum ve ekleme büyük (4000 ). Potansiyel olarak daha 10 dakika (varsayılan işlem zaman aşımı) son olabilir, ve bu da eksik bir işlem neden olur.
Saygılar.
CEVAP
Sorunuza yorum yaptığınız yorum için:
"...SavingChanges (her biri için kayıt)..."
Bu yapabileceğiniz en kötü şey! Her kayıt için SaveChanges()
Arama son derece toplu ekler yavaşlar. Çok büyük olasılıkla performansını artıracak bazı basit testler yapmak istiyorum:
SaveChanges()
sonra TÜM kayıtları sonra Ara.- Örneğin 100 kayıt sonra
SaveChanges()
Ara. - Örneğin sonra
SaveChanges()
100 kayıt çağrı ve bağlam atın ve yeni bir tane oluşturun. - Algılama devre dışı bırakın
Toplu ekler için ve böyle bir desen ile çalışan deneme duyuyorum:
using (TransactionScope scope = new TransactionScope())
{
MyDbContext context = null;
try
{
context = new MyDbContext();
context.Configuration.AutoDetectChangesEnabled = false;
int count = 0;
foreach (var entityToInsert in someCollectionOfEntitiesToInsert)
{
count;
context = AddToContext(context, entityToInsert, count, 100, true);
}
context.SaveChanges();
}
finally
{
if (context != null)
context.Dispose();
}
scope.Complete();
}
private MyDbContext AddToContext(MyDbContext context,
Entity entity, int count, int commitCount, bool recreateContext)
{
context.Set<Entity>().Add(entity);
if (count % commitCount == 0)
{
context.SaveChanges();
if (recreateContext)
{
context.Dispose();
context = new MyDbContext();
context.Configuration.AutoDetectChangesEnabled = false;
}
}
return context;
}
DB içine 560.000 varlıkları (9 skaler özellikler, navigasyon özellikleri) bir test programı var. Bu kod ile en az 3 dakika içinde çalışıyor.
Önemli "çok" ("çok" yaklaşık 100 veya 1000). sonra kayıtları SaveChanges()
Ara ve performans için Ayrıca SaveChanges sonra bağlam atın ve yeni bir tane oluşturmak için performansını artırır. Bu entites itibaren kapsamında, SaveChanges
, varlıkları hala devlet bağlamında Unchanged
bağlı olan yapmaz temizler. Adım adım ekleme yavaşlar ne bağlamında bağlı kuruluşlar artan boyutudur. Bu yüzden, bir süre sonra temizlemek için yararlıdır.
Burada 560.000 benim varlıklar için: birkaç ölçüm
- = 1, = recreateContext yanlış: commitCountbirçok saat(Geçerli yordam)
- = 100, = recreateContext yanlış: commitCount20 dakikadan fazla
- = 1000, = recreateContext yanlış: commitCount242 sn
- = 10000, = recreateContext yanlış: commitCount202 sn
- = 100000, = recreateContext yanlış: commitCount199 sn
- = 1000000, = recreateContext yanlış: commitCountbellek istisna dışında
- = 1, = recreateContext gerçek: commitCount10 dakikadan fazla
- = 10, = recreateContext gerçek: commitCount241 sn
- = 100, = recreateContext gerçek: commitCount164 sn
- = 1000, = recreateContext gerçek: commitCount191 sn
Yukarıda ilk test tutumu, performansı, doğrusal olmayan çok ve son derece zamanla azalır. "Saatler" bir tahmin, ben bu testi bitti, 20 dakika sonra 50.000 varlıklar uğradım.) ( Bu doğrusal olmayan davranışlar diğer tüm testlerde o kadar önemli değil.
Varlık Çerçevesi Kod Akıcı Apı: sütunl...
MVC3 kullanarak Varlık Çerçevesi için ...
birden çok sütun üzerinde KeyAttribute...
Devre dışı Varlık varsayılan olarak te...
Bir tamsayı'in kare kökü belirlem...