2011-02-17 47 views
5

ile iliştirdim, Poco nesnesiyle bir Entity Framework 4.0 var. edmx model dosyası veritabanından oluşturulur.İki varlık arasındaki ilişkiyi bir N-N ilişkisi

Bu veri standardına WCF hizmeti aracılığıyla erişilir, yalnızca bazı nesneler aldığım ve bunları geçerli veri içeriğine eklemem gerektiği (veya bunları yedeklemeyle yeniden yükleyeceğim) olduğu anlamına gelir.

Her şey bir olgu hariç, iyi iş gibi görünüyor: İki tablo arasındaki bir NN ilişkiyi ettik

, bu yüzden iki tablo kimliği dışında herhangi bir alan olmadan, bir dernek tablo ettik: Database model

LINQ bunu aşağıdaki şemaya dönüştürür, bu doğru gibi gözüküyor. LINQ Data model

Veri aldığımda, sorun yok, Right_group'a eklediğim veriler doğru şekilde "Haklar/Gruplar koleksiyonumda yeni nesne" ye dönüştürülüyor.

Ama bir şeyler değiştirmek ve kaydetmek çalışırsanız, çalışmıyor

public void SaveRights(Group group, List<Rights> rights){ 
    //here, group and rights are objects attached to the database 
    group.Rights.Clear(); 
    group.Rights.AddRange(rights); 
    _dataContext.SaveChanges(); 
} 

Benim soru şudur: Nasıl iki nesnelerin bu "ilişki" kaydedilir? Teşekkür ederiz!

+1

** Çalışmıyor ** beklenmedik davranışların en iyi tanımı değil. Peki SaveChanges'i çalıştırırsan ne olur? Veritabanına eklendiğinde, bunları, _dataContext'in aynı örneğinde yüklediğiniz anlamına mı geliyor? –

+0

Afedersiniz, SaveChanges() bittiğinde, veriler veritabanına kaydedilmez. Yani, WCF tarafına bir nesne gönderdiğimde, veri içeriğimin nesnesini ayırdım ve artık takip edilmiyorlar. Bu yüzden yeniden sunucumda geldiğimde, bu özellikleri iliştirmem ve değişiklik yapmam gerekiyor. – J4N

cevap

7

Eğer (bunu adapte olacak yani benim mühendislik uygulamalarında birinden alınan Kanunu) ilk böyle yapabilirsin veritabanından yüklerin yüklenmesini önlemek istiyorsanız:

public void AddAndRemovePersons(int id, int[] toAdd, int[] toDelete) 
    { 
     var mailList = new MailList { ID = id, ContactInformations = new List<ContactInformation>() };   
     this.db.MailLists.Attach(mailList); 

     foreach (var item in toAdd) 
     { 
      var ci = new ContactInformation { ID = item }; 
      this.db.ContactInformations.Attach(ci); 
      this.db.ObjectStateManager.ChangeRelationshipState(mailList, ci, ml => ml.ContactInformations, System.Data.EntityState.Added); 
     } 

     foreach (var item in toDelete) 
     { 

      var ci = new ContactInformation { ID = item }; 
      this.db.ContactInformations.Attach(ci); 
      this.db.ObjectStateManager.ChangeRelationshipState(mailList, ci, ml => ml.ContactInformations, System.Data.EntityState.Deleted); 
     } 
    } 

silerek bulundu O kadar zor bir ilişki kurdum ki o kodu oraya bıraktım. Bu çözümle ilgili bir şey, maillistin ve temasların, bu işlevin yürütülmesinden önce var olmasıdır. Devlet yöneticilerini takip etmelerini sağladım.

sen de kullanırsınız kaydetmek istediğiniz yeni nesneler ekliyorsanız

this.db.MailLists.AddObject(you new item here)

Bunu umut olur!

+0

Ben parralells içinde bulduğum ChangeRelationShipState kullanmak benim sorunumun anahtarıydı. Biraz kirli, ama çalışıyor – J4N

+0

Aslında, benim POCO nesnesinde List yerine ObservableCollection kullandığım için, LINQ onları istediği gibi izleyemez düşünüyorum. – J4N

+0

EF ve POCO için, EF'in koleksiyonunuzu geçersiz kılabilmesi için ICollection <> kullanmanız gerektiğini düşünüyorum.Şu anda nerede okuduğumu bulamıyorum: / –

0

Sadece bir düşünce ... Right_Group tablosundaki tuşlar nasıl ayarlanır? Birincil anahtar olarak hem IDRight ve IDGroup birlikte kullanırsanız - bu sorun oluşabilir. Bir suggetion, Right_Group tablosuna yeni bir sütun (ID) eklemek ve bu birincil anahtar olarak bu ID sahip olmaktır. Daha sonra, diğer sütunlardaki yabancı anahtarları (IDRight, IDGroup) kullanın.

İlgili konular