8

我正在使用 fluentmigrator 向表中添加一个新列。然后,我想用该列的唯一值更新表中的每一行。

目前当我使用:

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

它为所有行提供相同的值。

如何确保它为每一行调用该方法?

4

1 回答 1

10

我不确定 Bar.Generate 做了什么,但我猜它会创建一个 GUID 或唯一 ID。

如果是这样,那么您可以使用:

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

或者,如果您想要顺序 guid,那么您可以使用NEWSEQUENTIALID()

如果要为此唯一标识符添加新列,那么您需要做的就是指定新列 .AsGuid()

编辑:FluentMigrator 是一个小的流利的 dsl,并不意味着涵盖这样的复杂案例。没有办法(据我所知)用一个 sql UPDATE 来做到这一点,因此用 FluentMigrator 也没有简单的方法来做到这一点。您必须使用 ADO.NET 或 ORM(Dapper/NHibernate)获取表的行数,然后遍历每一行并使用自定义唯一标识符更新 Bar 列。因此,如果您有一百万行,那么您将不得不进行一百万次 sql 更新。如果您可以将 Bar.Generate() 方法重写为基于 NEWID() 函数的 Sql 函数,那么您可以将其作为一个 UPDATE 语句执行,并使用 FluentMigrator 的 Execute.Sql 方法调用它

您还没有提到您正在使用哪个数据库。但是像 Postgres 这样的一些非标准功能可以帮助您。

于 2012-09-04T15:39:00.903 回答