2012-09-04 11 views
5

Estoy usando fluentmigrator para agregar una nueva columna a una tabla. Entonces quiero actualizar cada fila en la tabla con un valor único para esa columna.Actualizar datos de fila con un nuevo valor por fila usando fluentmigrator

Actualmente cuando uso:

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

Se da el mismo valor para todas las filas.

¿Cómo me aseguro de que llame a ese método para cada fila?

Respuesta

7

No estoy seguro de qué hace Bar.Generate, pero supongo que crea un ID GUID o único.

Si es así, usted podría utilizar:

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

O si desea guids secuenciales entonces se podría utilizar NEWSEQUENTIALID().

Si va a añadir una nueva columna para este identier único, entonces todo lo que tendría que hacer es especificar la nueva columna .AsGuid()

EDIT: FluentMigrator es una pequeña DSL fluida y no está destinado a cubrir un caso complicado como este. No hay forma (hasta donde yo sé) de hacer esto con una ACTUALIZACIÓN de sql y, por lo tanto, no es una manera fácil de hacerlo con FluentMigrator. Deberá obtener el conteo de filas para la tabla con ADO.NET o un ORM (Dapper/NHibernate) y luego recorrer cada fila y actualizar la columna Bar con el identificador único personalizado. Entonces, si tiene un millón de filas, tendrá que hacer actualizaciones de un millón de sql. Si puede reescribir su método Bar.Generate() como una función Sql que se basa en la función NEWID() como this o this, puede hacerlo como una instrucción UPDATE y llamarla con el método Execute.Sql de FluentMigrator.

No ha mencionado con qué base de datos está trabajando. Pero algunos como Postgres tienen non-standard features que podrían ayudarte.

+0

es mi propia función que crea una cadena "amigable" única, lo siento no es una guía. – shenku

+2

¿Puede volver a escribir su función como una función SQL? De lo contrario, tendrá que recorrer todas las filas de su tabla. –

+1

Debe tenerse en cuenta que en el ejemplo del código, la palabra clave 'table' no debería estar allí, el comando no se ejecutará. Reemplace con su nombre de tabla real. – shanabus

Cuestiones relacionadas