Supponiamo di avere 3 classi: ClassA , ClassB e ClassC . Supponiamo ora di avere una classe Message . Vuoi una relazione one-to-many tra ciascuna di queste tre classi e il Messaggio.
L'obiettivo è che un Message deve "appartenere" a un ClassA , ClassB o a ClassC oggetto. Un oggetto ClassA / ClassB / ClassC può avere zero o molti Messages . La classe Message è la stessa per ognuna delle tre classi (cioè non dovrebbe esserci una diversa classe di Message per ognuna delle tre Classi A, B e C).
Considerando ora la modellazione dei dati su un DB relazionale (inoltre, sto usando ORM, in questo caso Entity Framework Code First ), mapperò ognuna di quelle 3 classi e il Message class a una tabella.
Ma poi, il problema sta cercando di applicare le relazioni che ho spiegato sopra. Vedo alcuni modi per farlo:
- Aggiungi tre chiavi esterne nullable (
ClassAID,ClassBID,ClassCID) alla tabella dei messaggi. per esempio. Se un messaggio appartiene a un oggettoClassA, quindiClassAIDavrà l'ID di tale obetto come valore eClassBIDeClassCIDsaranno nulli. Questo mi costringerà a scrivere un vincolo / trigger per assicurarmi che l'oggettoMessageabbia solo un valore in uno di quegli FK. Inoltre rende un po 'brutto nei livelli Business Logic e Presentation ogni volta che voglio sapere a quale oggetto appartiene un messaggio: il MessageObject avrebbe un riferimento nullable a un oggetto ClassA, ClassB e ClassC e dovrei controllare prima di presentarlo nell'interfaccia utente (ad es. un link dal messaggio al suo oggetto).

- Implemental'ereditarietàegeneralizza
ClassA,ClassBeClassC.IlmessaggiohaunFKperl'IDdellaclassegeneralizzata.CiòaggiungecomplessitàeinrealtànonrisolveilproblemadicapirefacilmenteaqualeClasseA/B/CècorrelatounMessaggio.
- Aggiungi una tabella
ClassToMessage(simile a una tabella di collegamento) che collega le 3 tabelle a quella del messaggio, nuovamente, tramite FK nullable. Una specie di combinazione dei due precedenti, ma non ancora esattamente una buona soluzione per gli stessi motivi.

Mipiacerebbesaperesec'èunmodoeleganteperraggiungereloscenariodesiderato,preferibilmenteavendoinmentel'approcciodiEntiyFramework.Grazieinanticipo.
MODIFICA1:
ImmaginaglioggettiMessaggiocomecommenti(ofile)inunastrutturaadalberodioggetti(glioggettiClassApossonoavereClassBeClassBpossonoavereClassC's...).Sidesideracheglioggettiditutteleclassiabbianozeroopiùcommenti.Vuoilastessatabelladicommentipertuttiicommenti(nonimportaseappartengonoaClassAoClassB...istanza).Vuoianchechesiafaciletrovareicommentiperundatooggettool'oggettoacuiappartieneuncommento.
EDIT2:
Altreduealternative:
- Implementalatabellapergerarchia(TPH)avendounClassAMessage,ClassBMessage...cheancoranonrisolveilproblema...
- Il messaggio memorizza l'ID dell'oggetto che lo possiede e il Tipo oggetto (indipendentemente dal fatto che sia stato un ClassA, ClassB ...). Nessuna relazione effettiva: livello di servizio o logica aziendale fa il resto (ahi).

HovistoquestoproblemaaffrontatoinStackOverflow,manonriescoatrovareunabuonasoluzione:
Primo codice di Entity Framework - Mappe di entità a uno o l'altro - Relazione oggetti multipli in codice prima
- Progettazione di database - articoli, post di blog, foto, storie
EDIT 3:
Sto perseguendo l'alternativa n. 4 (Tabella per gerarchia / ereditarietà delle tabelle di classe) e l'ho evoluta in un S.O. specifico. domanda: Entity Framework 6 Code First - Commenti su una struttura ad albero
