Update İşlemleri
BaseCrudDal.cs
içerisinde yer alan Update işlemlerinin nasıl olduğuna bu kısım altında değineceğiz.
Update()
Genel Yapısı
Arayüz, web api aracılığı ile hazırlanmış olan model update işlemine girdiği zaman bazı aşamalardan geçmektedir. Direkt olarak update işlemi gerçekleşmemekte bu aşamalar sayesinde araya girip model kontrol edilebilmekte ya da ek operasyonlar yapılabilmektedir.
Update işlemini yapabilmek için modelin IdentifiedModel
kalıtım almış olması gerekmektedir.
Hiyerarşisi
//Update işlemi için çağrılan ana metot
public virtual IPoWrapper<T> Update(object key, T model, bool byPassValidate = false)
{
IPoWrapper<T> wrappedModel = new PoWrapper<T>(model);
return Update(key, wrappedModel, byPassValidate);
}
//Diğer overload edilmiş Update metotları
//...
//...
//Update işlemine ait tüm operasyonlarının olduğu Update metotu
private IPoWrapper<T> Update(object key, IPoWrapper<T> wrappedModel, bool bulkOperation, ModelContext contextUpper, bool byPassValidate = false)
{
//Ortak metotlara taşınabilmesi için operasyon tipi belirlenmektedir
const DatabaseOperationType opType = DatabaseOperationType.Update;
//Model kullanıcıdan alındıktan sonra
//herhangi bir kontrol veya veri tabanı işlemi yapılmadan önce
//model üzerinde işlem gerçekleştirilebilir.
//Bu aşama Insert işlemindeki BeforInsert() işlemine denk gelmektedir.
wrappedModel = VeryBeforeUpdate(wrappedModel);
//VeryBeforeUpdate() sonrasında CustomValidate() işlemleri gerçekleştirilir.
//Burada özel olarak tanımladığımız iş kuralları işletilir.
CustomValidate(wrappedModel);
//PO katmanında modeller için attribute olarak tanımlanan kontroller burada işletilir.
//Örnek olarak CustomMinMaxVal() attribute'ü
if (!byPassValidate)
{
CommonValidate(wrappedModel, opType);
}
//...
//...
using (var conn = Connection)
{
conn.Open();
using (var sqlTxn = conn.BeginTransaction())
{
//...
//...
//VeryBeforeUpdate() sonrasında model üzerinde kontrollerin yapılıp bir hata yok ise
//Bu kısımda model üzerinde ek operasyonlar yapılabilir.
//CustomValidate() ve CommonValidate()'den geçtiği için,
//model veri tabanına basmaya hazır durumdadır.
wrappedModel = BeforeUpdate(wrappedModel, context);
//...
//...
//Bu kısım tam olarak Insert ile ayrıldığı noktadır
//Bu aşamada elimizde hem mevcut model
//hem de o modelin update edilmeden önceki hali olur.
//Bu kısımda update edilmeden önceki hali ile kıyaslama
//yapmamız gereken durumlarda kullanabilirz.
wrappedModel = JustBeforeUpdate(wrappedModel, new PoWrapper<T>(tmp), context);
//...
//...
//Bu aşamada ilgili kayıt veri tabanında güncellenir.
//Burada transaction halen açıktır.
//Bu işlem ile beraber model için;
//bir hata mesajı alır veya özel olarak eklenirse işlem RollBack edilir.
//Veri tabanı değişikliği geri alınır
wrappedModel = UpdateCallBack(wrappedModel, tmpMock, context);
//...
//...
}
}
//...
//...
//Bu aşamada artık transaction işlemi sonlandırılmış,
//ilgili kayıt veri tabanına basılmıştır.
wrappedModel = CommittedUpdateCallBack(wrappedModel, tmpMock);
//...
//...
return wrappedModel;
}
Belirtilen aşamalar sırasında herhangi bir hata olur ise Update işlemi devam etmeden wrappedModel
geriye döndürülür. IsValid
alanı false
şeklinde işaretlenir. ErrorMessages listesi içerisinden hata mesajlarına erişilebilir.
JustBeforeUpdate()
ve UpdateCallBack()
işlemleri arasında veri tabanı kontrolleri gerçekleştirilmiş olur. Burada veri tabanı ile ilgili bir uyumsuzluk var ise geriye hata mesajı döndürülür. Burada da dikkat edilmesi gereken UpdateCallBack()
aşamasında halen transaction açık olduğudur.
UpdateCallBack()
işlemi için transaction sonlandırılmadığı için bu aşamada her şey sonuçlanmış gibi düşünülmemelidir. Bu kısımda mail gönderimi, bildirim gönderimi gibi kaydın nihai olarak güncellendikten sonra gerçekleşmesi gereken işlemler yapılmamalıdır.
Kayıt nihai bir şekilde basıldıktan sonra yapılacak olan işlemler ComittedUpdateCallBack()
metotu içerisinde gerçekleştirilmelidir. Bu işlemler; mail gönderimi, bildirim gönderimi vb.
JustBeforeUpdate
içerisinde karşılaştırmamız için modelin ham halide gelmektedir. Burada örneğin mail adresi değişti ise mail at gibi bir isteği güncellenen ve ham halini kıyaslayarak kontrol edebiliriz. İşlem neticesinde mail gönderimi yapılacak ise tetikleyebiliriz.
BulkUpdate()
Liste şeklinde gelen modeller tek bir transaction işlemi altında listeyi dönerek Update()
işlemini çağırmaktadır.
Çok fazla kayıt olması durumda toplu güncelleme işlemi yavaşlamaktadır. Bunun için özel çözümler uygulanmaktadır.