Xrm.Sdk.Messages.DeleteRequest
Merhaba,
DeleteRequest, Dynamics 365 CE (CRM) ‘de herhangi bir Entity (Varlık) üzerinde mevcut olan bir kaydı (ROW) tamamen silmek için kullanılmaktadır. En basit haliyle SQL ‘de
Delete komutu ile aynı işi yapmaktadır.
IOrganizationService, Dynamics 365 CE (CRM) SDK içinde yer alan bazı işlemlere hızlı ulaşım imkanı sunan bir interface ve sağladığı bu “wrapper” metotlar arkaplanda
OrganizationRequest ve
OrganizationResponse yapısına dönüştürülerek
OrganizationServiceProxy ‘nin
Execute metodu ile işlenmekte. Dolayısıyla IOrganizationService.Delete metodunu kullanmakla DeleteRequest ile birlikte Execute metodunu kullanmak arasında temel mantıkta bir fark bulunmamakta.
Fakat
ExecuteMultipleRequest ve
ExecuteTransactionRequest gibi özel yapılarda birden fazla kayıt bilgisini silmek istiyorsak IOrganizationService.Delete metodunu kullanamayız, işte bu durumda
DeleteRequest kullanmamız gerekli.
DeleteRequest ile detaylı bilgiye buradan ulaşabilirsiniz.
DeleteRequest ‘in cevap türü
DeleteResponse ‘dir. Delete işlemi geriye bir değer döndürmez, bu nedenle
DeleteResponse içinde kullanabileceğimiz herhangi bir bilgi bulunmamaktadır.
DeleteRequest, Dynamics 365 CE (CRM) ‘de belirtilen kaydı ve bu kayda bağlı tüm alt kayıtları aynı transaction içinde siler.
.NET Projesi – Örnek Kod
.NET projelerimizde
Microsoft.CrmSdk.CoreAssemblies kütüphanelerini kullanarak Dynamics 365 CE (CRM) ‘de yeni bir kayıt oluşturabiliriz. Bu kütüphaneleri NuGet üzerinden projemize dahil edebiliriz.
Dynamics 365 CE (CRM) SDK kütüphanelerini projemize nasıl ekleyeceğimizi daha önce burada detaylı olarak anlatmıştım.
Yukarıdaki örnekte
DeleteRequest nesnemizi oluşturup,
Target ‘a, silmek istediğimiz kaydın bilgilerini
EntityReference türünde gönderiyoruz.
Oluşturduğumuz bağlantıya göre IOrganizationService ya da CrmServiceClient üzerinden Execute metodunu kullanarak işlemimizi tamamlıyoruz.
Yapmış olduğumuz işleme göre Request ve Response yapıları çift olarak bulunmaktadır.
DeleteRequest ‘in cevap türü
DeleteResponse ‘dir . Delete işlemi geriye bir değer döndürmez, bu nedenle
DeleteResponse içinde kullanabileceğimiz herhangi bir bilgi bulunmamaktadır.
Eşzamanlı Silme İşlemi (Optimistic Concurrency)
Silmek istediğimiz bir kayıt farklı bir kullanıcı ya da uygulama tarafından değiştirilmiş ve artık bizim için önemli bir kayıt haline gelmiş olabilir.
Örnek olarak e-posta adresi olmayan kayıtları listeleyip sırayla (for loop) sildiğimizi düşünelim. Tam o sırada ilgili kayıt için farklı bir kullanıcı tarafından bir güncelleme yapılarak e-posta adresi girilmiş olsun. Bu durumda kayıt artık bizim için önemli hale geldi ve silinmemesi gerekir. İşte bu yanlışlıkları önleyebilmek için
UpdateRequest ‘te olduğu gibi DeleteRequest yapısında da
ConcurrencyBehavior özelliği bulunmaktadır.
ConcurrencyBehavior hakkında detaylı bilgi için https://docs.microsoft.com/en-us/powerapps/developer/common-data-service/optimistic-concurrency adresini incelemenizi öneririm.
ConcurrencyBehavior için aşağıdaki değerler geçerlidir
Default
Herhangi bir kontrol gerçekleşmeden, o anda yapılan işlemi geçerli kabul eder ve gönderdiğimiz datayı siler. Eğer
ConcurrencyBehavior ‘a herhangi bir değer atamazsanız da Default olarak işlem yapar. Default kavramı, o an işlem yapılan context yapısına göre değişkenlik göstermektedir.
AlwaysOverwrite
İlgili kaydın
RowVersion bilgisini dikkate almadan, direkt olarak bizim göndermiş olduğumuz DeleteRequest ‘i işleme alır. Aynı zamanda ilgili Entity (Varlık) için Optimistic Concurrency özelliği aktif değilse AlwaysOverwrite değeri geçerli olacak şekilde işlem yapılır.
IfRowVersionMatches
İlgili kaydın Dynamics 365 CE (CRM) ‘de bulunan
RowVersion bilgisi ile bizim göndermiş olduğumuz değer eşleşirse silme işlemi yapılır, diğer durumda hata oluşur.
Bu bilgiyi gönderebilmek için ilk önce işlem yapacağımız kaydı
Retrieve metodu ile okuyup,
RowVersion bilgisini almamız gerekmekte.
RowVersion, Entity nesnesinde bulunan bir property ‘dir, bu nedenle Retrieve metodu ile kaydı alırken tüm alanları okumamıza gerek yok, kullanılacak alanların ihtiyacına göre sadece ilgili kaydın primarykey bilgisini okumamız yeterli olacaktır, böylece büyük bir Select sorgusu yerine daha basit bir sorgu çalışır.
Eğer
ConcurrencyBehavior değeri olarak
IfRowVersionMatches seçersek ve silmek istediğimiz kayıt için
RowVersion değerini belirtmemiz gerekli, aksi takdirde -2147088253 (0x80060883) numaralı The RowVersion property must be provided when the value of ConcurrencyBehavior is IfVersionMatches. hatası oluşur.
Eğer silmek istediğimiz kaydın
RowVersion bilgisi değişmişse -2147088254 (0x80060882) numaralı The version of the existing record doesn’t match the RowVersion property provided. hatası oluşur.
Daha önce
UpdateRequest detaylarını anlatırken UpdateRequest ‘in Target parametresi Entity türünde data aldığı belirtmiştim. Bu sayede
RowVersion bilgisini update için oluşturduğumuz Entity nesnesine atamıştık.
EntityReference daha çok kayıtlar arası ilişkileri belirtirken kullanılmaktadır (Lookup), fakat detaylarını incelediğimizde
RowVersion isimli bir parametreye sahip olduğunu görmekteyiz. Bu sayede
DeleteRequest ile birlikte de
RowVersion bilgisini kolayca gönderip, işlemlerimizde Optimistic Concurrency uygulayabiliriz.
Dynamics 365 CE (CRM) projelerinde hataları yönetebilmek için
FaultException<OrganizationServiceFault> türünde hataları yakalayan bir catch bloğu oluşturmamız gerekli. Bu sayede Dynamics 365 CE (CRM) SDK ‘dan dönen tüm hataları detaylı olarak ele alabiliriz.
Optimistic Concurrency yapısında 3 farklı hata mevcuttur, bu hataları aşağıdaki gibi ele alabiliriz.
ConcurrencyVersionMismatch
Bu hata
ConcurrencyBehavior = ConcurrencyBehavior.IfRowVersionMatches seçildiğinde meydana gelmektedir.
Silmek istediğimiz kayıt farklı bir kullanıcı tarafından Dynamics 365 CE (CRM) ‘de değiştirilmiş, bu nedenle belirttiğimiz
RowVersion bilgisi değişmiş. Bu durumda -2147088254 (0x80060882) numaralı The version of the existing record doesn’t match the RowVersion property provided. hatası oluşur.
ConcurrencyVersionNotProvided
Bu hata
ConcurrencyBehavior = ConcurrencyBehavior.IfRowVersionMatches seçildiğinde meydana gelmektedir.
Silmek istediğimiz kayıt için
RowVersion bilgisi göndermediğimiz zaman -2147088253 (0x80060883) numaralı The RowVersion property must be provided when the value of ConcurrencyBehavior is IfVersionMatches. hatası oluşur.
Hatayı önlemek için silmek istediğimiz kaydın
EntityReference datasına
RowVersion bilgisini eklemeliyiz.
OptimisticConcurrencyNotEnabled
Bu hata
ConcurrencyBehavior için herhangi bir değer belirtildiğinde meydana gelebilir. İşlem yaptığımız Entity (varlık) için Optimistic Concurrency özelliği aktif hale getirilmediği zaman oluşmaktadır. Entity ‘lerde Optimistic Concurrency özelliğini aktif hale getirmek için gerekli adımları https://docs.microsoft.com/en-us/powerapps/developer/common-data-service/optimistic-concurrency adresinde bulabilirsiniz.
Bu yazıda
Microsoft.Xrm.Sdk.Messages.DeleteRequest mesajını elimden geldiğince detaylandırmaya çalıştım.
Umarım faydalı bir yazı olmuştur.
Dynamics 365 CE (CRM) SDK mesajları hakkında tüm yazılara tek nokta üzerinden ulaşmak isterseniz https://www.emregulcan.com/microsoft-xrm-sdk-messages adresine bakabilirsiniz.
Dynamics 365 CE (CRM) SDK konusunda ilgili tüm yazılara tek nokta üzerinden ulaşmak isterseniz http://www.emregulcan.com/dynamics365-sdk adresine bakabilirsiniz.