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