2010-11-30 13 views
8

Al usar NHibernate, bajo qué circunstancias elegiría mapear una colección usando un elemento compuesto para obtener una colección de objetos de valor, en lugar de crear una entidad en toda regla y mapearla utilizando uno a muchos?NHibernate: ¿Por qué usaría <composite-element> sobre <one-to-many> para asignar una colección

Es posible que tenga una clase de valor-tipo 'PostalAddress' para representar una dirección. Si tenía una entidad persona y cada persona puede tener muchas direcciones se podría asignar esta relación como ésta (Opción 1):

<bag name="Addresses" table="PersonAddress"> 
    <key column="PersonID"/> 
    <composite-element class="PostalAddress"> 
     <property name="StreetAddress"/> 
     <property name="Town"/> 
     <property name="City"/> 
     <property name="Postcode"/> 
    </composite-element> 
</bag> 

O bien, podría crear una entidad 'PersonAddress' que tiene la propiedad escrito un 'PostalAddress' en y mapear las direcciones con una asociación uno-a-muchos (opción 2):

<bag name="Addresses"> 
    <key column="PersonID"/> 
    <one-to-many class="PersonAddress"/> 
</bag> 

<class name="PersonAddress"> 

    <id name="Id"> 
     <generator class="native"/> 
    </id> 

    <component name="Address" class="PostalAddress"> 
     <property name="StreetAddress"/> 
     <property name="Town"/> 
     <property name="City"/> 
     <property name="Postcode"/> 
    </component> 

</class> 

¿hay razones para no hacer la opción 1? ¿El hecho de que la tabla PersonAddress tenga una columna de ID sugiere que debería ser una entidad en sí misma, por lo tanto, use la opción 2?

Respuesta

19

< compuesta de elementos > es para cuando se tiene un conjunto de valores, mientras que < uno-a-muchos > es una colección de entidades. La característica definitoria de una entidad es un identificador único. Por lo tanto, si los elementos de su colección tienen un PK, use < uno a muchos >. De lo contrario, utilice < elemento compuesto >.

Otra forma de pensar es cómo determinar la igualdad. ¿Determina la igualdad comparando una ID o verificando que todas las propiedades sean idénticas? p.ej. En su aplicación, dos objetos representan la misma dirección if (address1.Id == address2.Id) o if (address1.Street == address2.Street & & address1.City == address2.City & & etc.)? No existe una respuesta correcta universal ya que depende del contexto de la aplicación. En muchos casos, el dinero es un objeto de valor. Si tiene estos $ 20 o esos $ 20, no importa. Solo la cantidad es relevante. Si estuvieras escribiendo una solicitud de seguimiento para una casa de moneda, probablemente necesiten saber con qué factura de $ 20 estás tratando y harías un seguimiento del número de serie en la factura de $ 20. En este caso, el dinero es una entidad. Todo depende de la aplicación y el contexto ...

Cuestiones relacionadas