Question

J'ai le schéma suivant dans la base de données:

  • BillingReferences (type de référence tinyint , élément de référencement tinyint , type de référence tinyint , élément de référence Referenced , tinyint , IsActive bit ) - où tous les champs (sauf IsActive) font partie d'un index unique.
  • BillingType (BillingTypeId tinyint , Nom varchar (50) )

ReferencingType et ReferencedType est une clé étrangère de BillingTypes. BillingTypes contient les lignes suivantes:

BillingTypeId | Nom

1 | Étiquettes

2 | Pays

3 | Fournisseurs de paiement

4 | Options de paiement

5 | Banques

ReferecingId et ReferencedId représentent l'identifiant de l'une des entités suivantes (dépend du type de référence / de référence):

  • Banques (identifiant bancaire tinyint , nom varchar (50) )
  • Pays (CountryId tinyint , nom varchar (50) )
  • Étiquettes (LabelId tinyint , Nom varchar (50) )
  • Fournisseurs de paiement (PaymentProviderId tinyint , Nom varchar (50) )
  • Options de paiement (PaymentOptionId tinyint , Nom varchar (50) )

A l'avenir, chaque entité aura plusieurs colonnes différentes ajoutées, mais pour l'instant, c'est le schéma de la simplicité.

Il existe un lien de (1- ) entre chaque entité (à l'exception des pays) et les pays. Les étiquettes ont un lien (1 - ) avec les banques, les fournisseurs de paiement et les options de paiement. Et Payment Provider a une connexion de (1- *) à Payment Provider

Ainsi, par exemple, si je souhaite connecter une banque avec BankId 201 à un pays avec CountryId 3003 Je vais avoir un enregistrement dans BillingReferences qui ressemblera à ça: Type de référencement = 5 Identifiant de référence = 201 Type référencé = 2 ID référencé = 3003 IsActive = 1

Nous n'avons pas créé de table de connexion / référence pour chaque type de connexion pour des raisons d'extensibilité. Si nous voulons ajouter une autre entité, il suffit d'ajouter sa table et d'enregistrer des enregistrements dans BillingReferences et BillingType.

Le problème est que je ne peux pas configurer une clé étrangère conditionnelle entre BillingReferences et chacune des entités et que je n'arrive pas non plus à configurer / mapper avec EntityFramework ...

Je n'ai trouvé aucun tutoriel ou exemple utilisant ce type d'implémentation. Suis-je obligé de créer une table de référence pour chaque connexion ou existe-t-il un moyen de le configurer avec EntityFramework?

Merci pour l'aide:)

Était-ce utile?

La solution

Si je comprends bien, il n’ya pas de moyen de le faire.

Je créerais une table séparée pour chaque type, sauf si vous avez vraiment une bonne raison de ne pas le faire. La considération que vous mentionnez n'est pas bonne, à mon humble avis.

Le fait d’avoir plus de tables NE vous permet pas d’imposer des contraintes de clé étrangère sur vos clés, et cela se traduit joliment en EF. Cela améliore également les performances: votre table de référence big ass avec un million de lignes mettra plus de temps à interroger que de tables plus petites (à moins que vous ne vouliez TOUJOURS toutes les références d'un type).

Autres conseils

Non seulement il n’existe aucun moyen de le faire dans Entity Framework, mais il n’existe aucun moyen de le faire en SQL non plus. Vous ne pouvez pas avoir une clé étrangère qui référence l'une des cinq tables.

Je pense que vous devriez plutôt avoir un type de référence parent abstrait, et créer les sous-types de types concrets de ce type parent. Maintenant, vous avez une seule clé étrangère, à une table. Vous pouvez choisir table par type ou table par mappage de hiérarchie. Étant donné que vous n'avez mentionné aucune colonne spéciale dans les types mentionnés, je pense que Le mappage table par hiérarchie serait un meilleur choix pour vous.

La seule façon dont vous pouvez accomplir ce que vous voulez est de créer un déclencheur pour gérer le traitement côté serveur. Vous ne pouvez pas mapper FK comme ça sur plusieurs tables. Mais un déclencheur peut gérer cette logique. Bien sûr, cela serait totalement extérieur à EF ...

Je vous recommanderais également de créer une table distincte pour chaque type. Plus simple à maintenir à long terme, je pense.

Je suppose que je vais suggérer à l'utilisateur Inferis de créer une table séparée pour chaque type.

Merci les gars pour vos réponses - ils ont aidé BEAUCOUP :)

En SQL, vous pouvez créer une vue pour chaque type basée sur une seule table. Chaque vue peut effectuer des jointures pour récupérer des informations liées à ce type uniquement. Cela vous permet également de penser aux liens dans leur ensemble en ignorant leur type.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top