Crm 4.0′da iki kayıt arasında N:N ilişki kurarak işlemler yapabiliriz. Mesela bir Eğitim(new_egitim) birden fazla Katılımcısı(systemuser) ve bir Katılımcının birden fazla Eğitime katıldığını düşünelim. Burada Eğitim(new_egitim) ile Katılımcı(systemuser) arasında N:N ilişki kurmamız gerekiyor. N:N ilişki sistemde ayrı bir tablo olarak tutulmaktadır. Burada new_new_egitim_systemuser adında bir tablo oluştuğunu veritabanından görebilirsiniz. Bazı durumlarda N:N ilişki kurulan bu kayıtlar oluştuğunda işlem yapmamız gerekebilir. Eğitime bir katılımcı eklediğimizde eğitim üzerindeki Katılımcı Varmı? bit alanı true yapan ve Eğitime ekli Katılımcı kaydı silindiğinde de Katılımcı Var mı? bit alanını false yapan kodu yazmayı deneyelim. Öncelikle ilk karşılaşacağımız sorun bunu yazacağımız Plugin’in mesajını Plugin Registration Tool’da göremememizdir. Bu sorunu nasıl aşacağımızı Plugin Registeration Tool’da olmayan Mesajlar ile Pluginde Nasıl İşlem Yapılır? makalesini inceleyerek öğrenebilirsiniz. N:N kayıt oluştuğunda plugin yazmak için AssociateEntities mesajını kullanmamız gerekir. N:N kayıt silindiğinde plugin yazmak için DisAssociateEntities mesajını kullanmamız gerekir. Associateentities’e ve Disassociateentities’e plugin yazmak için aşağıdaki gibi step eklememiz gerekmektedir.
Burada ekleyeceğimiz dll’e yazacağımız kod önemlidir. Çünkü step eklerken entity seçmediğimiz için (N:N tablo adı entity olarak gözükmemektedir.) yazdığımız plugin N:N ilişki kurulan her kayıt için çalışacaktır. Kodda sadece istenilen N:N ilişkinin adı kontrol edilmelidir.
AssociateEntities ve DisAssociateEntities mesajları ile işlem yapıldığında context’ten Moniker1, Moniker2, RelationshipName, OptionalParameter nesneleri gelmektedir. Burada Eğitim üzerine Katılımcı eklerken plugin yazdığım için Moniker1 new_egitim, Moniker2 systemuser entitylerini içerir. Burada RelationshipName ile N:N ilişkinin adını kontrol ederek her N:N ilişki için çalışmasını engelleyebiliriz.
Plugin registration toolda AssociateEntities mesajı için Step eklerken aşağıdaki gibi entity seçmiyoruz.
Plugin registration toolda DisAssociateEntities mesajı için Step eklerken aşağıdaki gibi entity seçmiyoruz.

Eğitime katılımcı eklendiğinde Eğitim üzerindeki alanı true yapan kod aşağıda şekildedir.
public void Execute(IPluginExecutionContext context)
{
if (context.InputParameters.Properties.Contains(“RelationshipName“)
&& context.InputParameters.Properties[
"RelationshipName"].ToString() == “new_new_egitim_systemuser“)
{
ICrmService _service = context.CreateCrmService(true);Moniker egitimMoniker = (Moniker)context.InputParameters.Properties["Moniker1"];
Moniker kullaniciMoniker = (Moniker)context.InputParameters.Properties["Moniker2"];Guid id = egitimMoniker.Id;
DynamicEntity entity = newDynamicEntity();
entity.Name = “new_egitim”;KeyProperty idProperty = newKeyProperty(“new_egitimid”, newKey(id));
entity.Properties.Add(idProperty);CrmBooleanProperty flagProperty = newCrmBooleanProperty();
flagProperty.Name = “new_kullanicivarmi”;
flagProperty.Value = newCrmBoolean();
flagProperty.Value.Value = true;
entity.Properties.Add(flagProperty);_service.Update(entity);
}
}
Eğitime katılımcı ekleyelim.
Kayıt refresh edildikten sonra Katılımcı Var mı alanı Evet olarak işaretlendiğini görebilirsiniz.
Eğitime ekli katılımcı kaydı silindiğinde Eğitim üzerindeki alanı false yapan kod aşağıda şekildedir.
public void Execute(IPluginExecutionContext context)
{
if (context.InputParameters.Properties.Contains(“RelationshipName“)
&& context.InputParameters.Properties["RelationshipName"].ToString() == “new_new_egitim_systemuser”)
{ICrmService _service = context.CreateCrmService(true);
Moniker egitimMoniker = (Moniker)context.InputParameters.Properties["Moniker1"];
Moniker kullaniciMoniker = (Moniker)context.InputParameters.Properties["Moniker2"];
Guid id = egitimMoniker.Id;
DynamicEntity entity = new DynamicEntity();
entity.Name = “new_egitim”;
KeyProperty idProperty = new KeyProperty(“new_egitimid”, new Key(id));
entity.Properties.Add(idProperty);CrmBooleanProperty flagProperty = new CrmBooleanProperty();
flagProperty.Name = “new_kullanicivarmi”;
flagProperty.Value = new CrmBoolean();
flagProperty.Value.Value = false;entity.Properties.Add(flagProperty);
_service.Update(entity);
}
}
Kayıt refresh edildikten sonra Katılımcı Var mı alanı Hayır olarak işaretlendiğini görebilirsiniz.



