2010-04-06 9 views
15

Ho apportato alcune modifiche alla struttura della tabella e in particolare alle relazioni tra tabelle nel mio database SQL Server. Ora voglio aggiornare il mio modello di Entity basato su questa nuova struttura di database.Come aggiornare correttamente un modello di entità dopo le modifiche della struttura del database?

Facendo clic con il pulsante destro del mouse sul file edmx, trovo l'opzione "Aggiorna modello dal database". Ma quando lo faccio ottengo una specie di aggiornamento del 50%: le nuove colonne appaiono nelle classi Entity ma sono confuso su molte proprietà di navigazione che sono ancora presenti nel modello sebbene le corrispondenti relazioni con le chiavi esterne non esistano più il database. (Modifica: Anche i membri delle classi modello non vengono cancellati anche se le colonne nel database sono state eliminate.)

Sto facendo qualcosa di sbagliato? O c'è un'altra opzione per aggiornare il modello inclusa la cancellazione delle proprietà di navigazione? O devo cancellare manualmente le proprietà di navigazione nei file del modello?

Sto utilizzando Entity Framework versione 1 (VS 2008 SP1).

Grazie per l'aiuto in anticipo!

risposta

16

Stai facendo la cosa giusta da aggiornare. Tuttavia, dopo aver generato automaticamente un modello, è possibile personalizzarlo. Quando si aggiorna, il progettista EF vuole provare a conservare eventuali personalizzazioni che si potrebbero aver fatto. Deve indovinare questo, e non è sempre giusto. Proverò a spiegare come indovina, in quanto potrebbe aiutarti.

tuo EDMX ha tre parti:

  • schema client (CSDL)
  • schema Store (SSDL)
  • Mapping tra cliente e negozio (MSL)

Il progettista "possiede "lo schema del negozio. Si rigenererà quasi da zero ogni volta che si aggiorna. Sebbene sia possibile personalizzare lo schema del negozio modificando manualmente l'SSDL, spesso si perdono queste modifiche quando si aggiorna il modello.

L'utente, invece, "possiede" lo schema del client. Il progettista genera lo schema client per la prima volta che viene eseguito e genera uno schema client per gli oggetti di metadati del database appena importati, ad esempio tabelle o colonne appena mappate. Ma una volta che lo schema client è stato generato per un oggetto, di solito non verrà rigenerato, perché il progettista sta tentando di preservare le personalizzazioni. Se, pertanto, si modifica il database in modo tale da influire sullo schema del client, è necessario aggiornare manualmente lo schema del client. È possibile farlo nella finestra di progettazione della GUI o manualmente nell'XML.

Nel tuo caso, la cosa più semplice da fare sarebbe probabilmente selezionare semplicemente la navigazione nella finestra di progettazione della GUI ed eliminarla. Questo presume che non ci sia più alcuna proprietà ID per la navigazione nel database, su entrambi i lati della relazione.

+2

Grazie per la buona spiegazione! Cancellerò quindi le proprietà di navigazione e i campi membri manualmente. E nel caso in cui rovinerò il modello, eliminerò il file edmx e ricreamo il modello da zero (poiché non ho alcuna personalizzazione fatta nel modello). – Slauma

3

Se si sta lavorando con un modello di entità non personalizzato e si ha semplicemente bisogno di ottenere modifiche dal database SQL nel progetto VS, trovo più semplice eliminare il modello di entità e rigenerarlo dalla stessa origine . In questo modo tutte e tre le parti del tuo EDMX rifletteranno ciò che è nel tuo database. Ho usato l'opzione "Aggiorna modello dal database" prima e poi ho modificato l'XML/designer e ho trovato che era un lavoro noioso e che richiede tempo quando si tratta di database di grandi dimensioni. Non fraintendermi, funziona al 100%, ma è molto più veloce per mantenere il tuo modello fresco ricreando.Anche se DEVI modificare alcune query LINQ-SQL in seguito, trovo che sia meglio modificare le query LINQ-to-SQL piuttosto che modificare i modelli EDMX. Detto questo, non ho ancora dovuto farlo. IMPORTANTE: assicurati di ricreare il modello con le stesse impostazioni di prima, ad esempio, se lo hai creato senza pluralizzare i nomi oggetto prima, fai lo stesso.

Problemi correlati