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.
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.
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.