Skip to main content

Insert İşlemleri

BaseCrudDal.cs içerisinde yer alan Insert işlemlerinin nasıl olduğu bu kısım altındadır.

Insert()

Genel Yapısı

Arayüz, web api aracılığı ile hazırlanmış olan model insert işlemine girdiği zaman bazı aşamalardan geçmektedir. Direkt olarak insert işlemi gerçekleşmemekte bu aşamalar sayesinde araya girip model kontrol edilebilmekte ya da ek operasyonlar yapılabilmektedir.

danger

Insert işlemini yapabilmek için modelin IdentifiedModel kalıtım almış olması gerekmektedir.

Hiyerarşisi

BaseCrudDal.cs
//Insert işlemi için çağrılan ana metot
public virtual IPoWrapper<T> Insert(T model, bool byPassValidate = false)
{
return Insert(model, null, byPassValidate);
}

//Diğer overload edilmiş Insert metotları
//...
//...

//Insert işlemine ait tüm operasyonlarının olduğu Insert metotu
public virtual IPoWrapper<T> Insert(IPoWrapper<T> wrappedModel, bool bulkOperation, ModelContext contextUpper, bool byPassValidate = false)
{
//Ortak metotlara taşınabilmesi için operasyon tipi belirlenmektedir
const DatabaseOperationType opType = DatabaseOperationType.Insert;

//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.
wrappedModel = BeforeInsert(wrappedModel);

//BeforeInsert() 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())
{
//...
//...

//BeforeInsert() 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 = JustBeforeInsert(wrappedModel, contextUpper);

//...
//...

//Bu aşamada ilgili kayıt veri tabanına basılır.
//Burada transaction halen açıktır.
//Bu işlem ile beraber model için;
//bir hata mesajı alır veya eklenirse işlem RollBack edilir.
//Veri tabanı değişikliği geri alınır
wrappedModel = InsertCallBack(wrappedModel, contextUpper);

//...
//...
}
}

//...
//...

//Bu aşamada artık transaction işlemi sonlandırılmış,
//ilgili kayıt veri tabanına basılmıştır.
wrappedModel = CommittedInsertCallBack(wrappedModel);

//...
//...

return wrappedModel;
}
danger

Belirtilen aşamalar sırasında herhangi bir hata olur ise Insert 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.

JustBeforeInsert() ve InsertCallBack() 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. Herhangi bir sorun yoksa InsertCallBack() içerisinde Id değeri veri tabanında alacağı değer ile beraber dönmektedir. Burada dikkat edilmesi gereken InsertCallBack() içerisinde elde edilen Id değeri henüz transaction işlemi sonlandırılmadığı için kullanılamaz.

InsertCallBack() 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 basıldıktan sonra gerçekleşmesi gereken işlemler yapılmamalıdır.

info

Kayıt nihai bir şekilde basıldıktan sonra yapılacak olan işlemler ComittedInsertCallBack() metotu içerisinde gerçekleştirilmelidir. Bu işlemler; mail gönderimi, bildirim gönderimi vb.

note

BeforeInsert() model ile ilgili ilk işlem noktası ve henüz kontrollerin yapılmamış olduğu aşamadır. Örneğin bu kısımda eğer kullanıcıdan alamadığımız zorunlu olan bir alan varsa ilgili değerin atama işlemi gerçekleştirebilir.

Basvuru.cs isminde bir modelde başvuru durumlarını tutan BasvuruDurumu property'sini örnek olarak düşünebiliriz. Bu alanı kullanıcıdan alamadığımızı ve varsayılan olarak Taslak değeri atayacak isek bu aşamada değer ataması yapabiliriz.

ExcelBulkInsert()

Arayüz aracılığı ile kullanıcıdan alınmış olan excellerin yükleme işlemleri için ilk olarak bu metot çağrılmaktadır. Bu kısımda gelen verilerin eşleme ve kontrol işlemi gerçekleştirilir. Eşleme ve kontrol işlemleri tamamlanan veri listesi veri tabanına kaydedilmek üzere BulkInsert()'e gönderilir.

BulkInsert()

Liste şeklinde gelen modeller tek bir transaction işlemi altında listeyi dönerek Insert() işlemini çağırmaktadır.

danger

Çok fazla kayıt olması durumda toplu ekleme işlemi yavaşlamaktadır. Bunun için özel çözümler uygulanmaktadır.