Xrm.Sdk.Messages.UpdateRequest

Merhaba,

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

UpdateRequest, Dynamics 365 CE (CRM) ‘de herhangi bir Entity (Varlık) üzerinde mevcut olan bir kaydı (ROW) güncellemek için kullanılmaktadır. En basit haliyle SQL ‘de Update komutuna denk gelmektedir.

Daha önce IOrganizationService.Update metodunu incelemiştik. Bu yazıda anlattığım tüm önemli noktalar aynen UpdateRequest 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.Update metodunu kullanmakla UpdateRequest 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 güncellemek istiyorsak IOrganizationService.Update metodunu kullanamayız, işte bu durumda UpdateRequest kullanmamız gerekli. UpdateRequest ile detaylı bilgiye buradan ulaşabilirsiniz.

UpdateRequest, Target isimli property ‘e Entity türünde data alan basit bir DTO nesnesidir. Oluşturduğumuz Entity nesnesini UpdateRequest ile Dynamics 365 CE (CRM) ‘de güncelleyebiliriz.

Burada dikkat etmemiz gereken en önemli nokta, oluşturduğumuz Entity nesnesinde PrimaryKey bilgisini eklememiz gerekmekte, aksi takdirde Dynamics 365 CE (CRM) SDK ‘dan hata alırız.

UpdateRequest ‘in cevap türü UpdateResponse ‘dir.

.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.UpdateRequest
Microsoft.Xrm.Sdk.Messages.UpdateRequest

Yukarıdaki örnekte ilk olarak Dynamics 365 CE (CRM) ‘de güncellemek istediğimiz kayıt için bir Entity nesnesi oluşturup ilgili alanları ekliyoruz. Bu örnekte ben Contact (Bireysel Müşteri) varlığını kullandım.

Update işleminde, sistem alanları dışında kalan tüm alanları güncelleyebiliriz. Eğer Late-bound yapı kullanıyorsanız KeyValue Dictionary olarak çalıştığı için sadece Dictionary içinde bulunan alanlar için işlem yapılacaktır, diğer alanların değerleri değişmeyecektir.

Late-bound ve Early-bound kavramlarının detayları için daha önce yazmış olduğum Entity Nedir? yazısını okuyabilirsiniz.

Güncelleme yapmak istediğimiz kaydın PrimaryKey yani Identity bilgisinin gerekli olduğunu belirtmiştim, bunun için Entity nesnesinde Id property ‘ine Guid formatında değer gönderebiliriz. Farklı bir yöntem olarak Entity ‘de bulunan Attributes içine entity["contactid"] = Guid.Parse("Kaydın ID bilgisi"); şeklinde kullanabiliriz. Burada contactid olarak belirttiğim alan sizin çalıştığınız varlığa göre değişecektir.

UpdateRequest nesnesini oluşturup, Target içine oluşturduğumuz Entity nesnesini ekliyoruz.

Son adımda ise 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. UpdateRequest ‘in cevap türü UpdateResponse ‘dir . Update işlemi geriye bir değer döndürmez, bu nedenle UpdateResponse içinde kullanabileceğimiz bir bilgi bulunmamaktadır.


Eşzamanlı Güncelleme İşlemi

Update işlemi her zaman riskli bir işlemdir. Özellikle yoğun data işlemlerinin olduğu çok kullanıcılı sistemlerde ya da multi-thread uygulamalarda aynı kayıt üzerinde farklı kullanıcılar ve entegrasyonlar tarafından aynı anda yapılacak işlemlerde kaydın veri bütünlüğü bozulabilir.

Bu gibi hatalı durumları engellemek için UpdateRequest ‘de ConcurrencyBehavior isimli bir property bulunmaktadır ve aşağıda detaylarını açıkladığım enum değerlerini almaktadır. Detaylar için https://docs.microsoft.com/en-us/dotnet/api/microsoft.xrm.sdk.concurrencybehavior?view=dynamics-general-ce-9 adresine bakabilirsiniz.

Ayrıca Optimistic Concurrency olarak adlandırılan bu yöntemin detayları için https://docs.microsoft.com/en-us/powerapps/developer/common-data-service/optimistic-concurrency adresinde anlatılan detayları incelemenizde fayda var.

Default

Herhangi bir kontrol gerçekleşmeden, o anda yapılan işlemi geçerli kabul eder ve gönderdiğimiz datayı günceller. Eğer ConcurrencyBehavior ‘a herhangi bir değer atamazsanız da Default olarak işlem yapar.

AlwaysOverwrite

Adı üstünde olan bu seçenek, bizim gönderdiğimiz güncellenmiş değerleri herhangi bir kontrol olmadan direkt olarak ilgili kayıt üzerinde günceller.

IfRowVersionMatches

İlgili kaydın Dynamics 365 CE (CRM) ‘de bulunan RowVersion bilgisi ile bizim gönderdiğimiz değer eşleşiyorsa güncelleme işlemi yapılır.

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, 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 güncelleme yapmak istediğimiz kayıt için RowVersion değerini belirtmezsek -2147088253 (0x80060883) numaralı The RowVersion property must be provided when the value of ConcurrencyBehavior is IfVersionMatches. hatası oluşur.

Eğer update yapmak 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.

Microsoft.Xrm.Sdk.Messages.UpdateRequest Optimistic concurrency IfRowVersionMatches
Microsoft.Xrm.Sdk.Messages.UpdateRequest 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.UpdateRequest Optimistic concurrency hataları
Microsoft.Xrm.Sdk.Messages.UpdateRequest Optimistic concurrency hataları

ConcurrencyVersionMismatch

Bu hata ConcurrencyBehavior = ConcurrencyBehavior.IfRowVersionMatches seçildiğinde meydana gelmektedir.

Update işlemi yapmak 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.

Update işlemi yapmak 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.

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

2 Responses

  1. 2020-08-29

    […] UpdateRequest (29 Ağustos 2020) […]

  2. 2020-09-06

    […] 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 […]

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.