2012-04-10 19 views
127

Bất kỳ ý tưởng nào về lý do tại sao điều này có thể bị phá vỡ?Giao dịch mới không được phép vì có các chủ đề khác đang chạy trong phiên LINQ To Entity

foreach (var p in pp) 
{ 
    ProjectFiles projectFile = (ProjectFiles)p; 
    projectFile.Status = Constants.ProjectFiles_ERROR; 
    projectFile.DateLastUpdated = DateTime.Now; 
    context.SaveChanges(); 
} 

Tôi đọc giải pháp khắc phục sự cố là truy xuất kết quả một lần trước vòng lặp foreach.

Nhưng tôi không làm điều đó? "pp" là tập hợp các kết quả trong trường hợp của tôi

+10

Có phải 'pp' là kết quả của truy vấn LINQ không? Nếu vậy, bạn có thể cần phải thực hiện 'ToList()' để ngắt kết nối nó khỏi cơ sở dữ liệu trước khi chạy vòng lặp của bạn. – SouthShoreAK

+0

Vâng. Ok, tôi sẽ thử rằng Cảm ơn –

+2

gọi lưu thay đổi bên ngoài vòng lặp – Mohsin

Trả lời

321

Biến số pp không phải là tập hợp các đối tượng, đó là một điều tra viên có thể trả về các đối tượng. Trong khi bạn sử dụng điều tra viên, nguồn vẫn phải mở.

Sử dụng phương thức ToList để nhận dạng điều tra viên thành bộ sưu tập. Điều đó sẽ đọc tất cả các mục từ điều tra viên và đóng kết nối với nguồn, để bạn có thể sử dụng kết nối cho những thứ khác.

foreach (var p in pp.ToList()) 
+14

Chúa ban phước cho bạn @ Guffa !!! +1 –

+2

Tuyệt vời !! Nó cũng làm việc với pp.ToArray() –

+2

Ricardo, nó hoạt động miễn là nó không phải là IQueryable –

7

Điều đang xảy ra là bạn đang sử dụng một kết nối SQL để lặp qua tập hợp các thực thể db, sau đó sử dụng kết nối khác để lưu thay đổi. Điều này xảy ra bởi vì các lớp của bạn về cơ bản là "kết hôn" với một ví dụ về kết nối db của bạn và không thể thay đổi bởi một lớp khác.

Cách để thực hiện việc này là gọi .ToList() trên bộ sưu tập của bạn trước khi lặp lại.

Và trong khi bạn đang ở đó, hãy gọi context.SaveChages() chỉ một lần sau khi thoát khỏi vòng lặp để tăng tốc mã.

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