2016-02-15 21 views
5

SaveChanges'u aramadan önce bağlama eklediğim varlıkları doğrulamak ve geçersiz olanları kaldırmak için EntityValidationErrors kaydedilmem mümkün mü?İçeriği kaydetmeden ve bağlamdan kaldırmadan önce varlıklar doğrulanıyor

Yaklaşık 3k varlıklarımın bir listesi var ve bunların bazıları, diğer tüm varlıkların kaydedilmesini engelleyen geçersiz veriler içeriyor. Her bir varlığı ayrı ayrı kaydetmek istemiyorum, ancak hataları olanları görmezden gelmek.

Bunun için bir çözüm bulmaya çalıştım Doğrulamayı devre dışı bırakabileceğinizi öğrendim. Eğer yapmış olsaydım, SaveChanges geçersiz olanları görmezden gelip diğerlerini mi saklardı?

Context.Configuration.ValidateOnSaveEnabled = false; 

Ben ancak varlık doğrulama çağırmak ve bağlamdan çıkarmak için bazı yöntemi çağırmak için tercih ediyorum. Ya da içeriği ekleyemeden önce bir varlığı doğrulamak bile mümkün müdür? Bu daha da iyi olurdu.

cevap

6

Doğrudan çözüm, kaydetmeden önce bunları doğrulamak ve bu varlıkları hatalarla ayırmaktır.

foreach (var error in dbContext.GetValidationErrors()) 
{ 
    dbContext.Entry(error.Entry).State = EntityState.Detached; 
} 

Ancak bu bir geçici çözüm gibi. IMO, veri katmanında kaydetmeyi önlemek yerine, doğrulama hatalarından daha önce (ör., Api katmanında) kaçınmalısınız.

+0

Evet, geçici bir çözüm gibi anlamına kullanarak bu Özellikler'i hariç tutun. Geçersiz verileri günlüğe kaydedeceğim ve bu hatayı daha sonra arayacağım ancak verilerin en azından bir kısmı kaydedilebiliyor olsaydı harika olurdu, aksi halde geçersiz bir sistem tüm sistemi felce uğratır. Her türlü olası hatayı önlemek ve tahmin etmek her zaman kolay değildir. Bu son çare hata tespiti ve önleme olmalıdır. – t3chb0t

1

ViewData.ModelState.Errors; Bundan sonra

foreach (var item in ViewData.ModelState.Keys) 
      { 
       int err=ViewData.ModelState[item].Errors.Count(); 
       if (err.Equals(1)) 
       { 
        // Add property name in a list 
       } 
      } 

db.Entry(model).State = EntityState.Modified; 
db.Entry(model).Property(x => x.Token).IsModified = false; 
+0

Bu ilginç bir yaklaşımdır. Bu durumda bana yardımcı olmaz ama belirli özellikleri devre dışı bırakabileceğimi bilmek güzel. Gelecekteki referans için kaydedeceğim ;-) – t3chb0t

İlgili konular