Domanda

Ho il seguente schema nel database:

  • Riferimenti di fatturazione (ReferencingType tinyint , ReferencingId tinyint , ReferencedType tinyint , ReferencedId tinyint , IsActive bit ) - in cui tutti i campi (tranne IsActive) fanno parte di un indice univoco.
  • BillingType (BillingTypeId tinyint , Nome varchar (50) )

ReferencingType e ReferencedType è una chiave esterna di BillingTypes. BillingTypes contiene le seguenti righe:

BillingTypeId | Nome

1 | Etichette

2 | Paesi

3 | PaymentProviders

4 | PaymentOptions

5 | Banche

ReferecingId e ReferencedId rappresentano l'ID di una delle seguenti entità (dipende dal tipo di riferimento / di riferimento):

  • Banche (BankId tinyint , Nome varchar (50) )
  • Paesi (CountryId tinyint , Nome varchar (50) )
  • Etichette (LabelId tinyint , Nome varchar (50) )
  • PaymentProviders (PaymentProviderId tinyint , Nome varchar (50) )
  • PaymentOptions (PaymentOptionId tinyint , Nome varchar (50) )

In futuro ad ogni entità verranno aggiunte alcune colonne diverse ma per ora questo è lo schema per semplicità.

Esiste una connessione di (1- ) tra ogni entità (eccetto i paesi) e i paesi. Le etichette hanno una connessione di (1- ) a Banche, PaymentProviders e PaymentOptions. E PaymentProviders ha una connessione di (1- *) a PaymentProviders

Quindi, ad esempio, se voglio collegare una banca con BankId 201 a un paese con CountryId 3003 Avrò un record in BillingReferences che avrà questo aspetto: ReferencingType = 5 ReferencingId = 201 ReferencedType = 2 ReferencedId = 3003 IsActive = 1

Non abbiamo creato una tabella di connessione / riferimento per ogni tipo di connessione a causa della considerazione dell'estendibilità - Se vogliamo aggiungere un'altra entità, tutto ciò che dobbiamo fare è aggiungere la sua tabella e aggiungere i relativi record in BillingReferences e BillingType.

Il problema è che non riesco a configurare una chiave esterna condizionale tra BillingReferences e ciascuna entità e non riesco a configurarla / mapparla con EntityFramework ...

Non sono stato in grado di trovare alcun tutorial o esempio che utilizzi questo tipo di implementazione. Sono obbligato a creare una tabella di riferimento per ogni connessione o esiste un modo per configurarlo con EntityFramework?

Grazie per l'aiuto :)

È stato utile?

Soluzione

AFAIK, non c'è modo di farlo.

Vorrei creare una tabella separata per ogni tipo, a meno che tu non abbia davvero una buona ragione per non farlo. La considerazione che menzioni non è buona, IMHO.

Avere più tabelle ti consente di inserire vincoli di chiave esterna sulle tue chiavi, e questo si traduce perfettamente in EF. Aiuta anche le prestazioni: la tua tabella di riferimento per il culo grosso con un milione di righe richiederà più tempo per la query rispetto a più tabelle più piccole (a meno che tu non voglia SEMPRE tutti i riferimenti per un tipo).

Altri suggerimenti

Non solo non c'è modo di farlo in Entity Framework, né c'è modo di farlo in SQL. Non puoi avere una chiave esterna che fa riferimento a una delle cinque diverse tabelle.

Quello che penso che dovresti fare invece è avere un genitore, un tipo di riferimento astratto e rendere i sottotipi di tipi concreti di questo tipo genitore. Ora hai solo una chiave esterna, per una tabella. È possibile scegliere la tabella per tipo o la tabella per la mappatura della gerarchia. Dato che non hai alcuna colonna speciale in nessuno dei tipi che hai menzionato, penso che mappatura tabella per gerarchia sarebbe la scelta migliore per te.

L'unico modo per realizzare ciò che volevi è creare un trigger per gestire l'elaborazione sul lato server. Non è possibile mappare gli FK in questo modo su più tabelle. Ma un trigger può gestire quella logica. Ovviamente sarebbe totalmente fuori da EF ...

Vorrei anche raccomandare di creare una tabella separata per ogni tipo. Penso che sia più semplice da mantenere a lungo termine.

Beh, immagino che userò il suggerimento di Inferis e creerò una tabella separata per ogni tipo.

Grazie ragazzi per le vostre risposte - hanno aiutato MOLTO :)

IN SQL è possibile creare una vista per ciascun tipo basata su una singola tabella. Ogni vista può eseguire join per recuperare informazioni relative a quel tipo. questo ti permette anche di pensare ai collegamenti nel loro insieme ignorandone il tipo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top