Perché è considerato OK avere un campo Id nelle entità dominio? Ho visto diverse soluzioni che forniscono una classe base con Id e GetHashCode/Equals basati su ID.DDD: chiavi primarie (Id) e ORM (ad esempio, NHibernate)
La mia comprensione del modello di dominio è che dovrebbe contenere solo le cose relative al dominio. Mentre in rari casi (ordini tracciabili) gli ID sono significativi, il più delle volte non forniscono nulla se non un modo semplice per fare riferimento agli oggetti in DB/sull'interfaccia utente.
Non vedo A è uguale a/benefici GetHashCode sia, dal momento che l'attuazione di identità mappa dovrebbe garantire che l'uguaglianza di riferimento è l'uguaglianza id comunque.
Stranamente, non riesco a trovare facilmente quello che pensano gli altri su questo argomento, quindi lo chiedo qui. Qual è l'opinione generale sull'uso di ID non relativi al dominio nelle entità di dominio? E ci sono problemi con NHibernate se non aggiungo Id alle mie entità di dominio?
UPDATE:
Grazie per le risposte.
Molti di loro suggeriscono che avere Id è l'unico modo per l'ORM di fare un aggiornamento del DB. Non penso che sia così. ORM tiene già traccia di tutte le entità caricate dal DB, quindi dovrebbe essere facilmente in grado di ottenere un ID internamente quando ne ha bisogno.
UPDATE 2:
risposta alla giustizia e simili punti: Che cosa succede se abbiamo un'applicazione web e necessità un modo per fare riferimento al soggetto tra le sessioni? Come modificare/risorsa/id?
Bene, vedo questo come una necessità specifica dell'interfaccia utente/ambiente vincolata, non di un modello di dominio necessario. Avere un servizio applicativo o un repository con il metodo GetIdentitity (coerente con il metodo Load (identità)) sembra essere sufficiente per questo scenario.
Come implementare GetIdentity se non si dispone di un identificativo? Otterrai l'oggetto dal client e dovrai cercare l'identità. Come lo troveresti? I contenuti dell'oggetto potrebbero essere stati modificati sul client. Non lo troveresti più. Ho anche risposto ai tuoi commenti alla mia risposta. –
Non mi riferisco al fatto quando ottengo un oggetto dal client. In questo caso, probabilmente ho un DTO con ID (e questo è rilevante anche se non ho un DB e memorizzo tutto in memoria, in questo caso l'id in DTO può essere una chiave in qualche Hashtable interno). Ma prima di inviare un oggetto al client, posso ottenere un ID e aggiungerlo al DTO che sto inviando. O semplicemente invia un ID in alcuni casi. –
Ho appena trovato nella documentazione NH che NH non ha bisogno di una proprietà id! Vedi la mia risposta, ho aggiunto una sezione. –