Pregunta

Tengo el siguiente esquema en la base de datos:

  • BillingReferences (ReferencingType tinyint , ReferencingId tinyint , ReferencedType tinyint , ReferencedId tinyint , IsActive bit ) - donde todos los campos (excepto IsActive) son parte de un Índice Único.
  • BillingType (BillingTypeId tinyint , nombre varchar (50) )

ReferencingType y ReferencedType es una clave externa de BillingTypes. BillingTypes contiene las siguientes filas:

BillingTypeId | Nombre

1 | Etiquetas

2 | Países

3 | Proveedores de pago

4 | Opciones de pago

5 | Bancos

ReferecingId y ReferencedId representan el Id. de una de las siguientes entidades (depende del tipo de referencia / referencia):

  • Bancos (BankId tinyint , Nombre varchar (50) )
  • Países (CountryId tinyint , nombre varchar (50) )
  • Etiquetas (LabelId tinyint , nombre varchar (50) )
  • PaymentProviders (PaymentProviderId tinyint , nombre varchar (50) )
  • PaymentOptions (PaymentOptionId tinyint , nombre varchar (50) )

En el futuro, cada entidad tendrá más columnas agregadas, pero por ahora este es el esquema para la simplicidad.

Hay una conexión de (1- ) entre cada entidad (excepto países) a los países. Las etiquetas tienen una conexión de (1- ) a bancos, proveedores de pago y opciones de pago. Y los proveedores de pago tienen una conexión de (1- *) a los proveedores de pago

Por ejemplo, si quiero conectar un banco con BankId 201 a un país con CountryId 3003 Tendré un registro en BillingReferences que se verá así: ReferencingType = 5 ReferencingId = 201 Tipo de referencia = 2 ReferencedId = 3003 IsActive = 1

No hicimos una tabla de conexión / referencia para cada tipo de conexión debido a la consideración de la capacidad de extensión: si queremos agregar otra entidad, todo lo que tenemos que hacer es agregar su tabla y agregar registros para ella en BillingReferences y BillingType.

El problema es que no puedo configurar una clave foránea condicional entre BillingReferences y cada una de las entidades y parece que tampoco puedo configurarlo / mapearlo con EntityFramework ...

No pude encontrar ningún tutorial o ejemplo que use este tipo de implementación. ¿Estoy obligado a crear una tabla de referencia para cada conexión, o hay alguna forma de configurar esto con EntityFramework?

Gracias por la ayuda :)

¿Fue útil?

Solución

AFAIK, no hay una manera de hacer esto.

Me gustaría crear una tabla separada para cada tipo, a menos que realmente tenga una buena razón para no hacerlo. La consideración que mencionas no es buena, IMHO.

Tener más tablas SI le permite poner restricciones de clave externa en sus claves, y se traduce muy bien en el EF. También ayuda al rendimiento: su gran tabla de referencia con un millón de filas tomará más tiempo para consultar que las tablas más pequeñas (a menos que SIEMPRE desee todas las referencias para un tipo).

Otros consejos

No solo no hay forma de hacer esto en Entity Framework, tampoco hay manera de hacerlo en SQL. No puede tener una clave externa que haga referencia a una de cinco tablas diferentes.

Lo que creo que deberías hacer en su lugar es tener un tipo de referencia principal, abstracto y hacer que los tipos concretos sean subtipos de este tipo principal. Ahora solo tienes una clave externa, para una mesa. Puede elegir la tabla por tipo o tabla por jerarquía. Dado que no tiene ninguna columna especial en ninguno de los tipos que mencionó, creo que tabla por mapa de jerarquía sería una mejor opción para usted.

La única forma en que podría lograr lo que quería es construir un Trigger para manejar el procesamiento en el lado del servidor. No puede asignar FK de esa manera a varias tablas. Pero un disparador puede manejar esa lógica. Por supuesto que estaría totalmente fuera de EF ...

También recomendaría que construyas una tabla separada para cada tipo. Creo que es más fácil de mantener a largo plazo.

Bueno, creo que voy a utilizar la sugerencia de Inferis y crear una tabla separada para cada tipo.

Gracias a todos por sus respuestas, ayudaron a MUCHO :)

EN SQL puede crear una vista para cada tipo basada en una sola tabla. Cada vista puede realizar uniones para recuperar información relacionada con ese tipo. esto también le permite pensar en los enlaces como un todo, ignorando su tipo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top