2012-09-26 13 views
7

Supponiamo che il mio oggetto abbia un campo Nome e desidero suddividerlo nei campi FirstName e LastName. O forse ha una stringa di indirizzo e sto aggiungendo i campi Lat e Lng che richiedono il geocoding. Ecc.Come si deve scrivere una migrazione di Entity Framework che trasforma i dati (preferibilmente utilizzando DbContext)?

Mi aspettavo di avere accesso al mio DbContext nei metodi Up() e Down(), ma tutto quello che sono riuscito a trovare (oltre alle funzioni integrate) è la chiamata .Sql(). Questo è sufficiente per aggiungere e rimuovere colonne, ma non per trasformare dati esistenti in nuovi formati.

È sicuro fare riferimento al mio DbContext all'interno di un'invocazione Up()? Oppure esiste un altro schema consigliato per implementare migrazioni che richiedono qualcosa di più di un SQL banale?

risposta

0

No, non è possibile utilizzare il metodo DbContext all'interno del metodo Up perché esso fa già riferimento a un nuovo modello, ma il database si rivolge ancora al vecchio modello.

Edit:

Tutte le migrazioni di dati deve essere fatto attraverso Sql. Ad esempio, è possibile creare una tabella temporanea, spostare i vecchi dati nella tabella temporanea, utilizzare la migrazione della struttura della tabella e spostare i dati dalla tabella temporanea indietro all'originale utilizzando alcune trasformazioni direttamente in SQL. La suddivisione dei valori varchar non dovrebbe essere un grosso problema.

+2

Le mie trasformazioni richieste non possono essere eseguite come SQL (la suddivisione di varchar era un esempio radicalmente semplificato). Questo tipo di operazione di migrazione è molto naturale in un ORM tipo anatra come ActiveRecord, ma ha senso che questa sia un'area in cui l'approccio EF potrebbe avere problemi. – Seth

0

Piuttosto che provare a dividere il nome in due campi diversi, ripensare la migrazione. A volte potrebbe essere meglio messo in scena. Posso pensare a due modi per eseguire la tua trasformazione.

migrazione percorso # 1: New Fields, quindi eliminare i vecchi

  1. Crea la migrazione per il nuovo campo per FirstName e cognome, e nel metodo Up(), avete ancora il campo Nome, dividerlo , inserire nei campi Primo e Ultimo.
  2. Creare un'altra migrazione per rimuovere il vecchio campo Nome.

percorso di migrazione # 2: Riutilizzo e rinominare

  1. Creare una migrazione aggiungendo il campo Cognome, e la ridenominazione nome a Nome, spostare i dati cognome, modificare il campo First/Nome rinominato solo tenere il primo nome.

Entrambi i percorsi presentano vantaggi e svantaggi. E indipendentemente dalla complessità della tua trasformazione, dovresti essere in grado di scomporla in fasi logiche per raggiungere l'obiettivo.

Problemi correlati