2009-06-04 25 views
8

Los objetos de valor no tienen identidad. ORM necesita identidad para actualizar la base de datos.DDD, objetos de valor y ORM

¿Cómo engañar a ORM?

(identificar el objeto de valor como interno no funciona, porque ORM vive en un ensamblaje diferente y moverlo al mismo ensamblaje no es aceptable).

Gracias de antemano.

Respuesta

4

Por lo que respecta a mi comprensión de DDD, los objetos de valor son solo una forma de particionar sus entidades. Si un objeto de valor debe almacenarse con una ID en la base de datos, no es un objeto de valor.

Ejemplo:

El modelo de dominio se parece a esto (C#):

public class Customer : Entity 
{ 
    public Guid CustomerID { get; } 

    public string LastName { get; set; } 

    public Address HomeAddress { get; set; } 
} 

public class Address : ValueObject 
{ 
    public string Street { get; set; } 

    public string City { get; set; } 

    public string ZipCode { get; set; } 
} 

La tabla de base de datos correspondiente sería algo como esto (Pseudo-SQL):

CREATE TABLE Customers 
(
    CustomerID, 

    LastName, 

    HomeAddress_Street, 

    HomeAddress_City, 

    HomeAddress_ZipCode, 
) 

Para almacenar las direcciones en una tabla separada, sería una entidad que tiene una ID.

+5

Pero luego el modelo de dominio es solo 1: 1 de la base de datos, la dirección puede seguir siendo un objeto de valor y aún tener una tabla separada. – TWith2Sugars

+1

No, no es un 1: 1 de la base de datos. Tiene una clase de Cliente y una clase de Dirección (que es el objeto de valor). En NHibernate, un objeto de valor se asigna como un componente. Tan pronto como tenga una entidad que necesita un Id, ya no será un objeto de valor. –

+6

Pero si necesita guardar la dirección en una tabla, requerirá una identificación de la base de datos. El hecho de que la base de datos requiera una identificación no significa que el objeto sea instantáneamente una entidad. – TWith2Sugars

3

Personalmente tengo el campo Id en el objeto de valor - lo trato como otro atributo del objeto de valor (como nombre, ubicación, etc.).

Puede que no sea cierto DDD pero funciona para mí.

+2

No creo que haya ningún problema con eso. Eric Evan tiene la cabeza dando vueltas porque es fácil hablar de conceptos sin dar un ejemplo. –

35

Cuando Eric Evans habla de "las entidades tienen identidad, Value Objects no", no está hablando de una columna de ID en la base de datos; está hablando de identidad como un concepto .

VOs no tienen conceptual identidad. Eso no significa que no deberían tener persistencia identidad. No permita que la implementación de persistencia oscurezca su comprensión de las Entidades frente a los VO.

Ver mi publicación here.

+0

Pero me gustaría mostrar esa falta de identidad conceptual en el código. Por cierto, he visto esa publicación antes. –

+1

Para aclarar su requisito: ¿desea ocultar la propiedad de ID en su objeto de VO, pero necesita el ORM para ver la propiedad de ID? Dos preguntas: 1) ¿Puede su ORM acceder a campos privados/internos? (como NHibernate) 2) ¿Cuánto beneficio obtienes al "ocultar" la propiedad de identificación del VO? –

+0

Olvidé mencionar - estoy usando NHibernate ... Entonces - ¿cómo hacerlo con NHibernate? –