7

Ho due classe come questa:salvare un oggetto con un rapporto bidirezionale in MongoDB usando ufficiale C# conducente

public Class Company 
{ 
    public IList<Employee> Employees; 
} 

public Class Employee 
{ 
    public Company WorkPlace; 
} 

quando voglio salvare un oggetto della classe Società:

MongoDatabase Database = MongoServer.GetDatabase("db"); 

var workPlace = new Company(); 

var employee = new Employee { WorkPalce = workPlace}  
workPlace.Employees = new List<Employee>{ employee }; 

Database.GetCollection<Company>("company").Save(workPlace); 

StackOverflow Eccezione sarà lanciato.

risposta

6

Ciò è dovuto al fatto che si dispone di un ciclo formato dalle classi che fanno riferimento l'un l'altro, chiaramente il driver non è attrezzato per gestire questo e non sono convinto che dovrebbe.

È necessario decidere come si desidera modellare questi dati nel database.
Se si hanno due raccolte, una di aziende e una di impiegati, quindi a livello di dati si dovrebbero includere solo gli ID per i riferimenti.

Se si dispone solo di una singola raccolta di società, quindi è sufficiente modificare la classe dipendente per fare riferimento alla società con un ID anziché un riferimento a un oggetto.

Tuttavia, è possibile che questo accada solo nel database, è possibile estendere il modello nel codice C# per aggiungere automaticamente il riferimento all'oggetto o caricarlo pigro ecc. (Evitando di selezionare problemi N + 1 come si fa) a seconda di ciò che è giusto per la situazione.

+0

se cambio la classe dei dipendenti per fare riferimento alla società con un ID al posto di un riferimento a un oggetto, quindi quando ho un elenco di dipendenti e iterare l'elenco e voglio utilizzare la società di ciascun dipendente, per ognuno verrà generata una query. questo sarà lento, non essere? –

+1

@OmidRH: Sì, in genere sarà relativamente lento. Esistono molte strategie per mitigare, ma dipende da cosa esattamente si vuole raggiungere. Ad esempio, se è necessario visualizzare il nome dell'azienda per ciascun dipendente, è possibile che si desideri copiare il nome dell'azienda per il dipendente. Visualizzazione di un elenco di dipendenti e dei loro nomi di società è facile allora, ma quando il nome della società cambia, dovrai aggiornare tutti i dipendenti. Questo è chiamato de-normalizzazione. In NoSql, le query necessarie per supportare modellano la struttura dei dati, non i dati che è necessario memorizzare. – mnemosyn