9

Tôi có một bảng có một chỉ mục duy nhất trên một bảng với một cột Ordinal. Vì vậy, ví dụ như bảng sẽ có các cột sau:DbContext SaveChanges Order of Statement Execution

TableId, ID1, ID2, TT

Chỉ số duy nhất là trên các cột ID1, ID2, TT.

Vấn đề tôi gặp phải là khi xóa bản ghi khỏi cơ sở dữ liệu, tôi sẽ xác nhận lại các số thứ tự để chúng được tuần tự lần nữa. chức năng xóa của tôi sẽ giống như thế này:

public void Delete(int id) 
    { 
     var tableObject = Context.TableObject.Find(id); 
     Context.TableObject.Remove(tableObject); 
     ResequenceOrdinalsAfterDelete(tableObject); 
    } 

Vấn đề là khi tôi gọi Context.SaveChanges() nó phá vỡ các chỉ số duy nhất vì nó dường như để thực hiện những điều khoản theo một thứ tự khác nhau hơn những gì họ đã được thông qua. Ví dụ sau đây sẽ xảy ra:

  1. resequence các Ordinals
  2. Xóa bản ghi

Thay vì:

  1. Xóa bản ghi
  2. resequence các Ordinals

Đây có phải là hành vi đúng đắn của EF không? Và nếu có, liệu có cách đánh giá hành vi này để ép buộc lệnh thi hành không?

Nếu tôi chưa giải thích điều này đúng cách, vui lòng cho tôi biết ...

Trả lời

9

Thứ tự lệnh hoàn toàn dưới sự kiểm soát của EF. Cách duy nhất làm thế nào bạn có thể ảnh hưởng đến trật tự đang sử dụng SaveChanges riêng biệt cho mỗi hoạt động:

public void Delete(int id) 
{ 
    var tableObject = Context.TableObject.Find(id); 
    Context.TableObject.Remove(tableObject); 
    Context.SaveChanges(); 
    ResequenceOrdinalsAfterDelete(tableObject); 
    Context.SaveChanges(); 
} 

Bạn cũng nên chạy mã trong giao dịch bằng tay tạo ra để đảm bảo số nguyên tử (=>TransactionScope). Tuy nhiên, giải pháp tốt nhất có lẽ sẽ là sử dụng thủ tục lưu trữ bởi vì việc tái xử lý của bạn phải kéo tất cả các bản ghi bị ảnh hưởng từ cơ sở dữ liệu sang ứng dụng của bạn, thay đổi thứ tự của chúng và lưu chúng trở lại cơ sở dữ liệu từng cái một.

Btw. làm điều này với mùi cơ sở dữ liệu. Vấn đề với việc có một khoảng trống trong chuỗi "thứ tự" của bạn là gì?

+0

Xin cảm ơn bạn đã trả lời! Tôi đã thực hiện điều này trước đó với một cơ sở dữ liệu và như bạn đã nói nó stinks. Mã này là khủng khiếp và là một nỗi đau, cộng với điều này sẽ chỉ có thể truy cập từ một phần quản trị và sẽ thay đổi một lượng nhỏ. Lý do chính cho các nhân viên được yêu cầu lại là người dùng quản trị có thể đặt thứ tự trên nhiều bảng và nhận được cầu kỳ hay bối rối khi họ thấy những khoảng trống ... Bit của một số tiền mà EF không thực hiện theo thứ tự bạn cung cấp. – didiHamman