Ho un problema complesso in cui vorrei utilizzare la riflessione sul mio mapping di Entity Framework per trovare tutte le chiavi esterne che fanno riferimento a una tabella e voglio i nomi delle colonne quelle sono le chiavi estranee.Entity Framework - Riflessione su chiavi esterne e relazioni/associazioni
In base a another post on SO, posso facilmente trovare le proprietà di navigazione su una tabella tramite riflessione. Ma questo non mi da il nome della proprietà o della colonna che contiene il valore della chiave esterna.
Il motivo per cui sto provando a farlo è che ho un gran numero di tabelle (quasi 40) che fanno riferimento a una tabella di elementi. Diciamo che un utente immette un nuovo valore nella tabella degli articoli chiamata "Andew" e in seguito un amministratore nota che in realtà è solo un errore di battitura per l'elemento "Andrew" già esistente. Ora voglio trovare tutti i riferimenti a "Andew" e modificare tali riferimenti in "Andrew". Preferirei farlo in modo efficiente, quindi usare le proprietà di navigazione inversa sarebbe troppo lento dato che devi caricare i valori prima di modificarli. Quello che mi piacerebbe fare è essere in grado di riflettere un elenco di tabelle e colonne, quindi inviare comandi di aggiornamento direttamente al database. Sarebbe simile a questa:
var command = String.Format("UPDATE [{0}] SET [{1}] = {{1}} WHERE [{1}] = {{0}}; ", fk.FromTableName, fk.FromColumnName);
dataContext.ExecuteStoreCommand(command, new Object[] { oldID, newID });
In LINQ to SQL questo era in realtà abbastanza facile ... 20 linee di riflessione sul codice generato automaticamente LINQ e mi è stato fatto, ma siamo passati a EF di recente e ho non è possibile trovare i nomi delle colonne chiave esterna tramite EF.
Un esempio semplificato di ciò che sto cercando: se ho un oggetto chiamato Employee con una proprietà di navigazione chiamata Manager e una chiave esterna di ManagerID, allora voglio sapere che Manager è la mia proprietà di navigazione e lo storage sottostante è la proprietà ManagerID. Voglio farlo rigorosamente attraverso la riflessione o i metadati in modo da poter creare una query dinamica da esso.
hai un voto negativo quindi presumo di non essere l'unico ad avere un po 'di problemi a capire cosa stai cercando. puoi semplicemente fare 'employee.managerId' o' employee.manager.id'? devi sapere qual è la convenzione, il tuo DBA non può semplicemente cambiare il DB senza che questo influenzi il tuo progetto in altri modi. – Eonasdan
@ Eonasdan - grazie. Mi stavo chiedendo perché fossi downvoted. Ho riscritto interamente per sperare di renderlo molto più chiaro. Sfortunatamente ora è molto più lungo, e stavo cercando di farla breve. – pbarranis