2012-09-04 32 views
5

Tôi đang sử dụng trình thông thạo để thêm cột mới vào bảng. Sau đó tôi muốn cập nhật mỗi hàng trong bảng với một giá trị duy nhất cho cột đó.Cập nhật dữ liệu hàng với một giá trị mới trên mỗi hàng bằng cách sử dụng trình thông thạo

Hiện nay khi tôi sử dụng:

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

Nó cung cấp cho cùng giá trị cho tất cả các hàng.

Làm cách nào để đảm bảo nó gọi phương thức đó cho mỗi hàng?

Trả lời

7

Tôi không chắc chắn Bar.Generate làm gì nhưng tôi đoán nó tạo ra một GUID hoặc id duy nhất.

Nếu vậy thì bạn có thể sử dụng:

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

Hoặc nếu bạn muốn guids tuần tự sau đó bạn có thể sử dụng NEWSEQUENTIALID().

Nếu bạn đang thêm một cột mới cho identier độc đáo này, sau đó tất cả các bạn sẽ cần phải làm là xác định các cột mới .AsGuid()

EDIT: FluentMigrator là một dsl thạo nhỏ và không có nghĩa là để trang trải một trường hợp phức tạp như thế này. Không có cách nào (theo như tôi biết) để làm điều này với một lần cập nhật sql và do đó không có cách dễ dàng để làm điều đó với FluentMigrator. Bạn sẽ phải lấy số đếm hàng cho bảng bằng ADO.NET hoặc ORM (Dapper/NHibernate) và sau đó lặp qua mỗi hàng và cập nhật cột Bar với mã định danh duy nhất tùy chỉnh. Vì vậy, nếu bạn có một triệu hàng thì bạn sẽ phải thực hiện một triệu bản cập nhật sql. Nếu bạn có thể viết lại phương thức Bar.Generate() của bạn như một hàm Sql dựa trên hàm NEWID() như this hoặc this thì bạn có thể thực hiện nó như một câu lệnh UPDATE và gọi nó bằng phương thức Execute.Sql của FluentMigrator.

Bạn chưa đề cập đến cơ sở dữ liệu nào bạn đang làm việc. Nhưng một số như Postgres có non-standard features có thể giúp bạn.

+0

chức năng của riêng tôi tạo ra một chuỗi "thân thiện" độc đáo, xin lỗi không phải là một guid. – shenku

+2

Bạn có thể viết lại hàm của mình dưới dạng hàm SQL không? Nếu không, bạn sẽ phải lặp qua tất cả các hàng trong bảng của bạn. –

+1

Cần lưu ý rằng trong ví dụ mã của bạn, từ khóa 'bảng' không nên ở đó, lệnh sẽ không chạy. Thay thế bằng tên bảng thực của bạn. – shanabus

Các vấn đề liên quan