Tengo dificultades para encontrar la mejor forma de modelar relaciones 1: 0,1 ("puede tener uno" o "tiene como máximo uno"). Creo que esto se llama cardinalidad Z. Por ejemplo, supongamos que tengo dos clases Widget
y WidgetTest
. No todos los Widgets se prueban y la prueba es destructiva, por lo que puede haber como máximo un WidgetTest por Widget. También suponga que no es apropiado agregar los campos WidgetTest a Widget.Modelado de relaciones uno a cero o uno (cardinalidad Z)
Me gustaría que mi interfaz pública sea:
Widget
WidgetTest { get; set; }
WidgetTest
Widget { get; }
Modelo 1: Widget tiene una propiedad WidgetTest y en la base de datos la tabla widget tiene una clave externa restringida únicamente a WidgetTest. Mi DBA argumenta que esto permitiría que exista un registro WidgetTest sin un Widget.
WidgetTable
WidgetTestId (FK, UQ)
Modelo 2: Widget tiene una colección privada de WidgetTest y hace cumplir la relación 0,1 por adición o eliminación de un único objeto de la colección controlado por un público propiedad WidgetTest. La base de datos modela esto como 1: m con WidgetTest que tiene una clave foránea únicamente restringida para Widget. Yo argumento que esto significa adoptar el modelo para que se ajuste al esquema de la base de datos (es decir, más trabajo para mí).
WidgetTestTable
WidgetId (FK, UQ)
¿Qué modelo es mejor? ¿Qué es más fácil de lograr con NHibernate? ¿O hay una tercera forma?
Editar ... Esto es lo que terminó con:
public class Widget
{
// This is mapped in NH using a access strategy
private IList<WidgetTest> _widgetTests = new List<WidgetTest>(1);
public WidgetTest
{
get { return _widgetTests.FirstOrDefault(); }
set
{
_widgetTests.Clear();
if (value != null)
{
_widgetTests.Add(value);
}
}
}
}
cuál es incorrecto con un 1 :? impuesto por PK-PK. mapeo que bastante recto ... –