Cum să gestionați relațiile în tabele Azure care sunt proprietăți listă în cod

Am o întrebare despre modul în care clasele mele ar trebui să fie cartografiate în entități Azure Table Storage. Spuneți că am două entități, BikeRider și BikeRace. În codul meu C#, am 2 clase și fiecare are o proprietate care este o colecție a celuilalt. Deci, clasa BikeRider are o proprietate List, și invers. Dacă nu este ideal aici, nu ezitați să vă opuneți, dar asta am și astăzi.

Cum se face harta într-o masă azură? Am găsit întrebări cu privire la SO, care discută cum să stochezi o relație de la mulți la mai mulți, dar întrebarea mea este mai exact cum ar trebui să se ocupe o proprietate a listei când salvezi obiectul care conține acea proprietate.

Mulțumiri!

ACTUALIZAȚI În timp ce așteptam un răspuns la acest lucru (și mă gândeam că nu pot obține niciunul), am venit cu această soluție:

Tipurile C# BikeRider și BikeRace au o proprietate List de tipul celeilalte, așa cum am descris mai sus. Fiecare are o metodă de instanță pentru a adăuga o instanță a celeilalte pe lista lor (adică BikeRace are o metodă numită "AddBikeRider" care adaugă o instanță a BikeRider la lista BikeRace.BikeRiders și invers).

Cu toate acestea, când salvez la Azure Table Storage, există 3 tabele cu următoarele informații:

BikeRider Tabel

  • PartitionKey, RowKey,

BikeRider Info RiderRace Tabel

  • PartitionKey: BikeRider RowKey
  • RowKey: BikeRace RowKey
  • Alte informații

BikeRace Tabel

  • PartitionKey, RowKey
  • O valoare separată pentru ID-ul fiecărui BikeRider în cursă (BikeRider RowKey - dar ar putea avea multe).

This way, if you are querying from the BikeRider and trying to get the BikeRaces he's been in, you have the partition key, and all of the rows in that partition are the BikeRaces. If you're querying from the BikeRace, and trying to get all the BikeRiders in a race, you have the BikeRider ID's to use in querying the BikeRider Tabel. You're not duplicating data beyond storing those keys in multiple places, so you don't have to multiple storage locations if your data changes.

Provocarea aici este ceea ce a postat Ming - dacă metoda de salvare a serviciului de tabelă aruncă o excepție pentru un tip cu o proprietate List, puteți crea o interfață mai simplă cu metoda proprie de salvare preliminară care gestionează tipul de listă și o transformă într- mai întâi de tipul de date capabil să-l persiste în tabelele Azure așa cum am descris? Este prea complicat sau prea fragil?

0

1 răspunsuri

acest lucru nu este acceptat. Tabela de stocare nu acceptă proprietățile listă. Dacă utilizați o proprietate a listei în modelul de date CLR, WCF Data Services va încerca să o serializeze și să aibă ca rezultat o excepție.

Pentru a simula o relație, puteți crea o proprietate asupra entității BikeRace, cum ar fi BikeRiderID.

Dacă aveți nevoie de o colecție numai pentru citire, puteți crea o metodă (în locul unei proprietăți) în clasa BikeRider, cum ar fi GetBikeRaces. În interiorul implementării, interogați tabelul BikeRace pentru a găsi toate entitățile ale căror BikeRiderID este ID-ul actual al călătorului bicicletei. Dacă doriți să actualizați lista curselor de biciclete, este necesar să actualizați tabelul BikeRider folosind o cerere separată.

Puteți să consultați http: //blog.smarx .com/posturi/tabele azur-to-many-relationships-in-windows pentru un eșantion.

0
adăugat
Mulțumesc lui Ming! Asta este de ajutor. Cu toate acestea, nu am vrut să salvez lista la masă, vroiam doar să știu cum s-ar putea să te ocupi de acea proprietate când salvezi. Înțeleg că dacă am doar un tip cu o proprietate List care derivă din TableServiceEntity, spui că voi obține o excepție atunci când încerc să salvez orice instanță de acel tip (corect?). Cu toate acestea, există o modalitate de a gestiona mai întâi conversia proprietății List înainte ca instanțele de acest tip să atingă metodele TableService în timpul unei salvări? Voi actualiza postarea pentru a arăta soluția mea
adăugat autor Andrew B Schultz, sursa
Dacă puteți, încercați să utilizați o metodă în locul unei proprietăți, astfel încât să nu încercați deloc problema serializării. Dacă trebuie să utilizați o proprietate, puteți gestiona evenimentul WritingRequest ( msdn.microsoft.com/en-us/library/… ). Aici puteți utiliza e.Content pentru a obține fluxul serializat. îl puteți modifica și elimina lista înainte de a fi trimis la serviciul de stocare de tabel. Acest lucru necesi
adăugat autor Ming Xu - MSFT, sursa