Xrm.Sdk.Messages.DeleteRequest

Merhaba,

Bu yazıda Dynamics 365 CE (CRM) SDK ‘da Microsoft.Xrm.Sdk.Messages namespace altında yer alan DeleteRequest ‘i inceleyeceğiz.

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.

Daha önce IOrganizationService.Delete metodunu incelemiştik. Bu yazıda anlattığım tüm önemli noktalar aynen DeleteRequest için de geçerlidir.

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, Target isimli property ‘e EntityReference türünde data almaktadı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.

Microsoft.Xrm.Sdk.Messages.DeleteRequest
Microsoft.Xrm.Sdk.Messages.DeleteRequest

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.

Daha önce belirttiğim gibi Execute metodu parametre olarak OrganizationRequest türünde bir nesne alır ve başarılı işlem sonrası geriye OrganizationResponse türünde bir cevap döner.

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.

Fakat DeleteRequest ‘in Target parametresi EntityReference türünde data almakta. Peki bu durumda RowVersion bilgisini nasıl göndermemiz gerekiyor?

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.

Microsoft.Xrm.Sdk.Messages.DeleteRequest Optimistic concurrency IfRowVersionMatches
Microsoft.Xrm.Sdk.Messages.DeleteRequest Optimistic concurrency IfRowVersionMatches

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.

Microsoft.Xrm.Sdk.Messages.DeleteRequest Optimistic concurrency hataları
Microsoft.Xrm.Sdk.Messages.DeleteRequest Optimistic concurrency hataları

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.

You may also like...

1 Response

  1. 2020-09-07

    […] DeleteRequest (06 Eylül 2020) […]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

This site uses Akismet to reduce spam. Learn how your comment data is processed.