2011-05-29 12 views
5

In his blog, Ayende sugiere que el uso de uno-a-uno probablemente no sea la mejor manera de implementar una relación de objeto tradicional 1: 1 (por ejemplo, customer.Name == nombre.Cliente).NHibernate uno-a-uno vs 2 muchos-a-uno

  1. ¿Cómo elijo cuándo usar la relación de uno a uno?
  2. ¿Por qué elegir 2 uno-a-muchos
  3. qué manera funciona el uno-a-uno (no hay columnas FK generado)

uno a uno:

One-to-one

2 muchos-a-uno:

enter image description here

+0

¿Está seguro de que no se generan columnas FK? Para mí se generan, y la base de datos se ve exactamente como se vería con una relación de uno a muchos. ¿Quizás usaste 'Invserse' para ambos lados por error? –

+0

Sí, estoy seguro: la tabla uno a uno se parece a la entidad, sin clave FK. – Darbio

+2

Hay dos formas de hacer uno a uno. La forma en que lo generó, utiliza las claves primarias de ambas entidades para unirlas. En el segundo caso, tiene una clave externa con una restricción única http://nhforge.org/doc/nh/en/index.html#mapping-declaration-onetoone – Vadim

Respuesta

2

La única razón por la que me he encontrado para usar el mapeo de uno a muchos es por el rendimiento.

Inicialmente fui con uno a uno hasta que el proyecto tocó la pared con un problema de rendimiento. El problema ocurre porque, por lo general, no se puede tener una carga diferida para el mapeo uno a uno en el reverso. P.ej. cuando tienes la entidad A que puede (pero no tiene que) tener la entidad B relacionada en ese mapeo. En ese caso, para cada entidad A que carga, la entidad B también se carga. Esto se hace para evitar errores al verificar si existe un objeto relacionado. El proxy para la carga diferida te induciría a pensar erróneamente que existe una entidad relacionada, aunque no sea así. Si comprueba la existencia entidad relacionada como esto va a estar en un problema

if (entityA.EntityB == null) HandleNoEntityB(); 

Si utiliza uno-a-muchos mapeo sin embargo, la carga diferida no es ningún problema, porque desarrollador está trabajando con una colección de la que podemos crear proxy.

if (entityA.EntitiesB.Count == 0) HandleNoEntityB(); 

Esto no tiene por qué ser un problema si se puede hacer una suposición en su sistema que la entidad A tiene siempre exactamente una entidad relacionada B. En ese caso, se debe configurar contrained = "true" en la que se cartografía.

Cuestiones relacionadas