Domanda

Ho un oggetto dominio usato in una mappa identità (le chiavi sono la proprietà Id dell'oggetto).

Pseudocodice:

map = new Mapping();
map[domainObj.Id] = 'foo';

Osservo l'oggetto per dirmi quando è stato salvato nel database:

domainObj.bind('saved', function() {
    map[domainObj.Id] = 'new foo!'
})

Per i nuovi oggetti il ??campo Id è vuoto e non popolato fino a quando non viene salvato nel database.

E qui sta il mio problema. Nel caso di nuovi oggetti, la ricerca " map [domainObj.Id] " fallisce perché l'identità dell'oggetto è cambiata dopo essere stata salvata!

Qual è il modo migliore per usare un oggetto in una mappa di identità come questa?

Vincoli :

  1. Sto usando un linguaggio che non consente gli oggetti come chiavi in ??un mapping [JavaScript]
  2. Il campo ID deve essere generato sul server quando si salva un nuovo oggetto

Aggiorna

Grazie per il feedback. Vorrei davvero che gli oggetti valore fossero mappati allo stesso modo delle entità: solo perché l'oggetto valore non è stato salvato non significa che non abbia un valore su cui mappare per la mia applicazione. In realtà sto capendo male cos'è una mappa di identità (che, dopo aver riletto la definizione del modello, risulta che non sto veramente usando).

La soluzione che mi è venuta in mente è praticamente la risposta di Igor: ogni oggetto riceve un id casuale al momento dell'istanza. È unico, immutabile e immutabile durante la vita del contesto in cui l'oggetto vive. È lì per entrambe le entità dal db e le nuove istanze. Il tweak per le entità è che è impostato per corrispondere alla vera identità dell'oggetto. Questo rende il debug un po 'più semplice. Questo è il valore che uso come chiave nella mappatura.

È stato utile?

Soluzione

Fino a quando un oggetto non ottiene l'identità, è solo un oggetto valore . Solo dopo che l'identità è stata stabilita diventa un'entità .

Fino a quando l'oggetto non diventa un'entità non puoi davvero inserirlo in una mappa di identità come la tua - non ha senso, dal momento che non puoi estrarlo (poiché non hai una chiave univoca per trovarlo).

Un possibile approccio:

  1. Aggiungi un flag alla classe che indica lo stato dell'oggetto (nuovo / salvato).
  2. Implementa un ID temporaneo (lato client) per questi oggetti
  3. Opzionale:
    1. conserva " nuovo " oggetti in una separata mappa identità (se non puoi evitare conflitti di ID tra ID client e server)
    2. conserva " nuovo " oggetti nella stessa mappa identità (se puoi evitare conflitti di ID tra ID client e server)
  4. Una volta che l'oggetto è stato salvato, sostituire l'ID client con l'ID server, impostare lo stato su salvato, passare alla mappa identità principale (se necessario).

Vedi qui le entità vs. oggetti valore

Altri suggerimenti

Bene, dovrai trovare un modo per rimandare l'aggiunta dell'oggetto alla mappa fino a quando dopo non è stato salvato e assegnato un ID.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top