2012-09-04 6 views
5

Ich benutze fluentmigrator, um eine neue Spalte zu einer Tabelle hinzuzufügen. Ich möchte dann jede Zeile in der Tabelle mit einem eindeutigen Wert für diese Spalte aktualisieren.Aktualisieren von Zeilendaten mit einem neuen Wert pro Zeile mit Hilfe von fluentmigrator

Zeit, wenn ich benutze:

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

Es denselben Wert für alle Zeilen gibt.

Wie kann ich sicherstellen, dass diese Methode für jede Zeile aufgerufen wird?

Antwort

7

Ich bin nicht sicher, was Bar.Generate tut, aber ich vermute, es schafft eine GUID oder eindeutige ID.

Wenn ja, dann könnten Sie verwenden:

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

Oder wenn Sie sequenzielle guids wollen, dann könnten Sie NEWSEQUENTIALID() verwenden.

Wenn Sie eine neue Spalte für diese einzigartige identier hinzufügen, dann alles, was Sie tun würden müssen, ist die neue Spalte angeben .AsGuid()

EDIT: FluentMigrator ist ein kleines fließend dsl und ist nicht zur Deckung gemeint ein komplizierter Fall wie dieser. Es gibt keinen Weg (soweit ich weiß), dies mit einem sql UPDATE zu tun und daher keine einfache Möglichkeit, dies mit FluentMigrator zu tun. Sie müssen die Zeilenanzahl für die Tabelle mit ADO.NET oder einem ORM (Dapper/NHibernate) ermitteln und dann jede Zeile durchlaufen und die Spalte "Spalte" mit dem benutzerdefinierten eindeutigen Bezeichner aktualisieren. Wenn Sie also eine Million Zeilen haben, müssen Sie eine Million SQL-Aktualisierungen vornehmen. Wenn Sie Ihre Bar.Generate() - Methode als Sql-Funktion neu schreiben können, die auf der NEWID() - Funktion wie this oder basiert, dann könnten Sie dies als eine UPDATE-Anweisung tun und sie mit der Execute.Sql-Methode von FluentMigrator aufrufen.

Sie haben nicht erwähnt, mit welcher Datenbank Sie arbeiten. Aber einige wie Postgres haben non-standard features, die Ihnen helfen könnten.

+0

es ist meine eigene Funktion, die eine einzigartige "freundliche" Zeichenfolge erstellt, tut mir leid, keine Guid. – shenku

+2

Können Sie Ihre Funktion als SQL-Funktion neu schreiben? Andernfalls müssen Sie alle Zeilen in Ihrer Tabelle durchlaufen. –

+1

Es sollte beachtet werden, dass in Ihrem Codebeispiel das Schlüsselwort 'table' nicht vorhanden sein sollte, der Befehl wird nicht ausgeführt. Ersetzen Sie durch Ihren tatsächlichen Tabellennamen. – shanabus

Verwandte Themen