HI mọi người. Mình thực hiện lệnh update dữ liệu bảng product, trước khi thực hiện update mình có select ra giá trị của product cũ để so sánh giữa 2 phiên bản save xuống có khác nhau gì không để thực hiện xử lý dữ liệu. Khi update thì bị lỗi db.SaveChanges() không save được. Mã: public ActionResult Update(Product model) { var ProductCodeOld = db.Products.Where(p => p.Id == model.Id).FirstOrDefault().ProductCode; ...... //thực hiện update thì bị lỗi dbc.Entry(model).State = System.Data.Entity.EntityState.Modified; dbc.SaveChanges(); ModelState.Clear(); }
Bạn thử sửa code lại như sau nhé: Mã: public ActionResult Update(Product model) { var ProductCodeOld = db.Products.AsNoTracking().Where(p => p.Id == model.Id).FirstOrDefault().ProductCode; ...... //thực hiện update thì bị lỗi dbc.Entry(model).State = System.Data.Entity.EntityState.Modified; dbc.SaveChanges(); ModelState.Clear(); } Ở đây bạn thêm AsNoTracking() vào nghĩa là: banjd dang nói với Emtity Framework rằng không cần theo dõi kết quả của truy vấn, và không cần xử lý lưu trữ bổ sung các giá trị được trả về. Sự khác biết giữa dùng AsNoTracking() và không dùng AsNoTracking() khi truy xuất. Nếu bạn có AsNoTracking(): nghĩa là dữ liệu được truy xuất không bị theo dõi bởi ngữ cảnh nên khi bạn lưu dữ liệu trở lại cơ sở dữ liệu, bạn phải đính kèm và đặt trạng thái chính xác của dữ liệu để EF biết rằng nên cập nhật dự liệu hiện tại thay vì chèn một cái mới. Nếu bạn không sử dụng AsNoTracking(): bạn không cần phải đính kèm, đổi trạng thái, thay đổi dữ liệu tất cả. Vì cơ chế theo dõi xử lý trong Emtity Framework đã làm mọi việc cho bạn.
Kiến thức bổ ích từ hàm AsNoTracking() mà mình không biết, bị cái này hoài, giờ đã biết cách xử lý, cảm ơn ad rất nhiều.
bài viết rất hay và chi tiết. cảm ơn bạn đã chia sẻ bài viết này. mong bạn sẽ ra nhiều bài viết hữu ích hơn nữa để nhiều người biết đến bạn. chúc bạn ngày tốt lành
Kiến thức bổ ích từ hàm mà mình không biết, bị cái này hoài, giờ đã biết cách xử lý, cảm ơn ad rất nhiều ạ