2012-09-04 9 views
5

Sto utilizzando fluentmigrator per aggiungere una nuova colonna a una tabella. Quindi voglio aggiornare ogni riga della tabella con un valore univoco per quella colonna.Aggiornamento dati riga con un nuovo valore per riga utilizzando fluentmigrator

Attualmente quando uso:

Update.Table("Foo").InSchema("dbo").Set(new { Bar = Bar.Generate() }).AllRows(); 

Si dà lo stesso valore per tutte le righe.

Come si assicura che chiami quel metodo per ogni riga?

risposta

7

Non sono sicuro di ciò che fa Bar.Generate ma suppongo che crei un GUID o un ID univoco.

Se è così allora si potrebbe utilizzare:

Execute.Sql("update dbo.Foo set Bar = NEWID()"); 

Oppure, se volete GUID sequenziali allora si potrebbe utilizzare NEWSEQUENTIALID().

Se si aggiunge una nuova colonna per questo identier unica, quindi tutto ciò che avrebbe bisogno di fare è specificare la nuova colonna .AsGuid()

EDIT: FluentMigrator è una piccola dsl fluente e non è destinato a coprire un caso complicato come questo Non c'è modo (per quanto ne so) di farlo con un SQL UPDATE e quindi non è un modo semplice per farlo con FluentMigrator. Dovrai ottenere il conteggio delle righe per la tabella con ADO.NET o un ORM (Dapper/NHibernate) e quindi eseguire il ciclo di ciascuna riga e aggiornare la colonna Bar con l'identificativo univoco personalizzato. Quindi se hai un milione di righe allora dovrai fare un milione di aggiornamenti sql. Se è possibile riscrivere il metodo Bar.Generate() come una funzione Sql basata sulla funzione NEWID() come this o this, è possibile farlo come un'istruzione UPDATE e chiamarla con il metodo Execute.Sql di FluentMigrator.

Non hai menzionato il database con cui stai lavorando. Ma alcuni come Postgres hanno non-standard features che potrebbero aiutarti.

+0

è la mia funzione personale che crea una stringa "amichevole" unica, mi spiace non un guid. – shenku

+2

Riesci a riscrivere la tua funzione come una funzione SQL? Altrimenti dovrai scorrere tutte le righe della tabella. –

+1

Va notato che nel tuo esempio di codice, la parola chiave 'table' non dovrebbe essere lì, il comando non verrà eseguito. Sostituisci con il tuo nome effettivo della tabella. – shanabus

Problemi correlati