tutorial mvc framework first example español create code c# sql-server entity-framework entity-framework-6 edmx

c# - mvc - entity framework model first



La relación de Entity Framework 1 a 1 a través de la tabla de asociación no funciona en EDMX (2)

Es un "error" con todo el diseño de EF: Entity Framework 4-6.1x solo distingue la multiplicidad en las claves primarias .

Por lo tanto, aunque sabemos (y los modelos RA) que es una relación 1-1 debido a una restricción de clave candidata , a EF no le gusta y no le gustará. Mala suerte.

Las "soluciones" incluyen:

  1. Cambiar el modelo a algo que EF entienda (EF entiende Code First, no RA). De acuerdo, esto puede indicar un "problema" con el modelo de RA seleccionado, pero es ortogonal a la pregunta.

  2. Vivir con las reglas de multiplicidad generadas incorrectamente y "usar con cuidado"; el trabajo sucio puede envolverse, pero debe agregarse manualmente fuera del modelo generado automáticamente.

  3. .. Hmm, otros?

El complemento desvergonzado para las preguntas no resueltas tiene que ver con la misma característica de falta de núcleo:

Tengo las siguientes tablas en la base de datos de SQL Server

Que tiene una tabla de asociación 1-1 (FooBar) que tiene índices únicos en FooId correspondiente, BarId, y la clave primaria es (FooId, BarId).

Para que quede claro, FooBar no permite que ningún FooId (debido a una restricción única) esté en la tabla más de una vez, ni ningún BarId (debido a una restricción única) puede estar en la tabla más de una vez. Esto es lo que lo convierte en una tabla asociativa 1-1.

Quiero tener esta tabla de asociación en lugar de una relación 1-1 entre Foo y Bar porque en mi escenario del mundo real, Bar tendrá otras relaciones con diferentes tablas no relacionadas y querré tablas de asociación similares (en lugar de agregar nuevas columnas FK a Bar para cada nueva mesa)

Que luego traigo estas tablas a mi diseñador de EDMX. La relación se presenta como muchos a muchos en lugar de uno a uno.

Lo cual por supuesto no es lo que quiero. Puedo cambiar manualmente el modelo a una relación 1-1.

Pero luego aparece un error (en el diseñador).

¿Es esto un error o no es posible crear una asociación 1-1 de esta manera en EF?


La relación que has mostrado en tu primer gráfico no es una relación 1 a 1 en lo que se refiere a EF.

Es una relación de muchos a muchos entre Foo y Bar

Piensa en ello de esta manera:

Posibles combinaciones con los siguientes valores de Foo y Bar

Foo 1 2 3 Bar 1 2 3 FooBar 1, 1 1, 2 1, 3 2, 1 2, 2 2, 3 3, 1 3, 2 3, 3

Su tabla FooBar es una clave compuesta, lo que significa que es una combinación de los valores de Foo y Bar que componen la clave, no una relación de 1 a 1.

para definir una relación de 1 a 1 entre Foo y Bar, su esquema debería verse más o menos así:

Foo FooId PK Bar FooId PK FK to Foo.FooId

la tabla FooBar no es necesaria para una relación 1 a 1 entre foo y bar.

Como indicó en sus preguntas / comentarios: sí, pone una restricción única en las partes individuales de su clave compuesta, pero EF no tiene en cuenta las restricciones únicas para su modelo al determinar una relación. Si desea una relación 1 a 1, debe crear un modelo 1 a 1, en lugar de burlarse de una relación 1 a 1 a través de restricciones únicas.