¿Por qué se considera correcto tener un campo Id en las entidades de dominio? He visto varias soluciones que proporcionan una clase base con GetHashCode/Equals basado en Id y Id.DDD: claves principales (Id) y ORM (por ejemplo, NHibernate)
Mi comprensión del modelo de dominio es que debe contener solo cosas relacionadas con el dominio. Si bien en casos excepcionales (órdenes rastreables) los Ids son significativos, la mayoría de las veces no proporcionan nada, excepto una forma simple de referenciar objetos en DB/on UI.
No veo los beneficios Equals/GetHashCode tampoco, ya que la implementación de Identity Map debería garantizar que la igualdad de referencia sea igualdad de id.
Extrañamente, no puedo encontrar fácilmente lo que otras personas piensan sobre este tema, así que lo estoy preguntando aquí. ¿Cuál es la opinión general sobre el uso de Ids no relacionados con el dominio en las entidades de dominio? ¿Y hay algún problema con NHibernate si no agrego Ids a las entidades de mi dominio?
ACTUALIZACIÓN:
Gracias por las respuestas.
Varios de ellos sugieren que tener Id es la única forma de que el ORM haga una actualización de base de datos. No creo que este sea el caso. ORM ya realiza un seguimiento de todas las entidades cargadas desde el DB, por lo que debería ser capaz de obtener un ID internamente cuando lo necesite.
ACTUALIZACIÓN 2:
respuesta a la Justicia y puntos similares: ¿Qué pasa si tenemos una aplicación web y necesidad una manera de hacer referencia a la entidad entre las sesiones? Me gusta edit/resource/id?
Bueno, veo esto como una necesidad específica de la interfaz de usuario restringida/entorno, no es un modelo de dominio necesario. Tener un servicio de aplicaciones o un repositorio con el método GetIdentitity (coherente con el método Load (identity)) parece ser suficiente para este escenario.
¿Cómo implementaría GetIdentity si no tiene un identificador? Obtendría el objeto del cliente y tendría que buscar la identidad. ¿Cómo lo encontrarías? El contenido del objeto podría haber sido cambiado en el cliente. No lo encontrarías más. También respondí tus comentarios a mi respuesta. –
No me refiero al hecho cuando recibo un objeto del cliente. En este caso, probablemente obtenga algún DTO que tenga un Id (y esto es relevante incluso si no tengo un DB y almaceno todo en la memoria, en este caso Id en DTO puede ser una clave en alguna Hashtable interna). Pero antes de enviar el objeto al cliente, puedo obtener un Id y agregarlo al DTO que estoy enviando. O simplemente envíe un Id en algunos casos. –
¡Acabo de encontrar en la documentación de NH que NH no necesita una propiedad de identificación! Ver mi respuesta, agregué una sección. –