2013-11-20 16 views
6

Tôi gặp phải lỗi khi thực hiện tác vụ đơn giản.Ngoại lệ DBConcurrency sử dụng Entity Framework 6

Tôi đang sử dụng mã Entity Framework 6 trước.

Tôi đang thêm một thực thể mới vào ngữ cảnh của mình, xóa nó và sau đó thực hiện lưu. Điều này tạo ra một ngoại lệ DBConcurrency (tôi là người dùng duy nhất).

Để thực hiện điều này, tôi thực hiện như sau:

zurich.TagProjectGroupItems.Add (tagProjectGroupItem); zurich.TagProjectGroupItems.RemoveRange (các mục);

(đối tượng ban đầu thêm vào là một phần của bộ sưu tập)

int counter = zurich.SaveChanges();

này tạo ra các ngoại lệ sau đây:

Một ngoại lệ của loại 'System.Data.Entity.Infrastructure.DbUpdateConcurrencyException' xảy ra ở EntityFramework.dll nhưng không được xử lý theo mã người dùng Thông tin thêm: Lưu trữ cập nhật, chèn hoặc xóa câu lệnh đã ảnh hưởng đến số hàng không mong muốn (0). Các thực thể có thể đã được sửa đổi hoặc bị xóa vì các thực thể đã được tải. Làm mới các mục ObjectStateManager.

Ngữ cảnh đối tượng cho tôi biết rằng tôi có 0 mục nhập mới, 0 đã cập nhật và 1 để xóa. Tôi sẽ tưởng tượng nó đang cố gắng để loại bỏ các thực thể từ cơ sở dữ liệu và trả về 0 kết quả vì thực thể đã không được viết.

Tôi đang làm điều gì đó đáng sợ sai? Trước đây tôi chưa bao giờ sử dụng mã và chỉ sử dụng mô hình đầu tiên trong EF4. Tôi bối rối.

Rất cám ơn,

Rob

+0

Bạn có nói rằng đối tượng mục mà bạn đang xóa khỏi bộ sưu tập chứa 'tagProjectGroupItem' mà bạn * vừa thêm * vào ngữ cảnh không? –

+0

Đúng Ciaran. Các ui cho phép người dùng thêm một thực thể và cũng để loại bỏ/xóa nó. Tôi có thể làm loại bỏ nhưng tôi nhận được kết quả tương tự rõ ràng. –

+0

Nhưng tại sao thêm mục vào ngữ cảnh nếu bạn định xóa mục đó ngay sau đó? Liệu việc thêm và loại bỏ các thực thể không phải là các sự kiện/xử lý riêng biệt? –

Trả lời

0

DbUpdateConcurrencyException của được gọi là "khi nó được dự kiến ​​rằng SaveChanges cho một thực thể sẽ cho kết quả trong một bản cập nhật cơ sở dữ liệu nhưng trên thực tế không có hàng trong cơ sở dữ liệu bị ảnh hưởng." Source

Tôi nghĩ EntityFramework thực hiện kiểm tra này để ngăn sự cố đồng thời trong trường hợp nhiều người dùng.

Bạn có thể gắn vào một zurich.SaveChanges(); khác ngay sau khi thêm mục và sau đó nó sẽ loại bỏ thành công các mục, nhưng như bạn đề cập, điều này không lý tưởng. Có lẽ thay vào đó bạn nên kiểm tra tập hợp các mục - và nếu tagProjectGroupItem được chứa trong các mục, sau đó không gọi zurich.TagProjectGroupItems.Add(tagProjectGroupItem); và thay vào đó hãy xóa tagProjectGroupItem khỏi bộ sưu tập trước khi gọi số hoạt động cơ sở dữ liệu.

+1

Tôi đã xoay sở để làm tròn nó bằng cách kiểm tra trạng thái của thực thể khi loại bỏ nó khỏi ngữ cảnh. Trong phương thức remove nếu nó là entitystate.added thì tôi đặt nó để tách ra. Vì vậy, khi lưu được bắt đầu thực thể được tách ra và không gây ra vấn đề. Điều này dường như giải quyết vấn đề nhưng có vẻ hơi khó hiểu. –

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