Tôi đang gặp sự cố với mã Entity Framework-đầu tiên trong MVC3. Tôi đang nhấn ngoại lệ này:Khuôn khổ thực thể Mã-Đầu tiên: "ObjectStateManager không thể theo dõi nhiều đối tượng có cùng khóa."
Một đối tượng có cùng khóa đã tồn tại trong ObjectStateManager. ObjectStateManager không thể theo dõi nhiều đối tượng với cùng một khóa .
Điều này được giải quyết nhiều lần trên SO, nhưng tôi đang gặp sự cố khi sử dụng bất kỳ giải pháp được đề xuất nào trong trường hợp của tôi.
Đây là một mẫu mã:
FestORM.SaleMethod method = new FestORM.SaleMethod
{
Id = 2,
Name = "Test Sale Method"
};
FestContext context = new FestContext();
//everything works without this line:
string thisQueryWillMessThingsUp =
context.SaleMethods.Where(m => m.Id == 2).Single().Name;
context.Entry(method).State = System.Data.EntityState.Modified;
context.SaveChanges();
chỉnh sửa để làm rõ: Tôi đang cố gắng để cập nhật một đối tượng mà đã tồn tại trong cơ sở dữ liệu.
Mọi thứ hoạt động tốt mà không có truy vấn được ghi chú trong mã. Trong ứng dụng của tôi, bộ điều khiển của tôi đang khởi tạo ngữ cảnh và ngữ cảnh tương tự được chuyển đến một số kho lưu trữ được sử dụng bởi bộ điều khiển - vì vậy tôi không thể sử dụng một ngữ cảnh khác cho thao tác truy vấn ban đầu. Tôi đã cố gắng để loại bỏ các thực thể từ đang được theo dõi trong ObjectStateManager, nhưng tôi dường như không thể nhận được bất cứ nơi nào với điều đó một trong hai. Tôi đang cố gắng tìm ra một giải pháp sẽ làm việc cho cả hai điều kiện: đôi khi tôi sẽ cập nhật một đối tượng được theo dõi bởi ObjectStateManager, và đôi khi nó sẽ xảy ra chưa được theo dõi.
FWIW, chức năng kho thật của tôi trông như thế này, giống như đoạn code trên:
public void Update(T entity)
{
//works ONLY when entity is not tracked by ObjectStateManager
_context.Entry(entity).State = System.Data.EntityState.Modified;
}
public void SaveChanges()
{
_context.SaveChanges();
}
Bất kỳ ý tưởng? Tôi đã chiến đấu này quá lâu ...
Cảm ơn. (Nó sẽ không cho phép tôi bỏ phiếu cho câu trả lời của bạn vì tôi mới.) Vấn đề với điều này là tôi không biết khi nào tôi đang thực hiện truy vấn trước một bản cập nhật trong tương lai. Truy vấn có thể được chôn ở đâu đó trong lớp dịch vụ, và cuối cùng, khi tôi thực hiện cập nhật trên cùng một thực thể được truy vấn, tôi đã gặp lỗi. Có cách nào để tôi có thể loại bỏ đối tượng khỏi theo dõi ngữ cảnh hay nhận được đối tượng đang được theo dõi bởi ngữ cảnh và giao tiếp với ngữ cảnh mà tôi thực sự đang cập nhật đối tượng này đang được đề cập không? Tôi đã nghiên cứu một số theo hướng này, nhưng chưa có may mắn. – Josh
Nó phụ thuộc vào ý định của truy vấn. Nếu truy vấn nhằm đưa một thực thể vào trong ngữ cảnh để nó có thể được cập nhật và lưu lại, đó là bình thường, thì bạn nên thiết kế cho điều đó, có thể bằng cách đảm bảo trước khi bạn lưu thực thể đó. được đưa vào trước. Nếu mục đích của truy vấn là lấy một số thuộc tính của thực thể từ cơ sở dữ liệu vì lý do nào đó mà không đưa thực thể vào ngữ cảnh, thì hãy sử dụng AsNoTracking trên truy vấn đó như được hiển thị ở trên. –
Để thêm vào nhận xét trước đó của tôi, nếu bạn muốn đảm bảo rằng thực thể đã được đưa vào, sau đó sử dụng phương thức Tìm trước khi cập nhật các thuộc tính trong thực thể và lưu. Bạn cũng có thể sử dụng truy vấn thay vì Tìm - theo mặc định truy vấn sẽ chỉ đưa vào thực thể nếu nó chưa có trong ngữ cảnh. Nhưng Find hiệu quả hơn. –