2010-09-28 35 views
5

Tôi đang sử dụng ASP.NET MVC và Entity Framework. Tôi có trang web Chỉnh sửa người mà trong đó các trường của người đó có thể được chỉnh sửa, sau đó trong hành động đăng lại, tôi sử dụng đoạn mã sau.Ngăn cập nhật giá trị không thay đổi trong ASP.NET MVC và Entity Framework

var person = objectCtx.Persons.Where(s => s.Id == id).FirstOrDefault(); 
TryUpdateModel(person, form.ToValueProvider()); 
objectCtx.SaveChanges(); 

Nó hoạt động rất tốt. Tuy nhiên trong SQL được tạo ra, tôi vẫn có thể thấy câu lệnh UPDATE ngay cả khi các giá trị không bị thay đổi. Có cách nào để tránh điều này trong ASP.NET MVC hoặc trong Entity Framework?

Trả lời

0

Bạn chỉ đơn giản là không có nó gọi SaveChanges() nếu thông tin là như nhau.

+0

Nhưng không phải tất cả thông tin đều giống nhau. Người dùng chỉ có thể thay đổi trường onle, nhưng Entity Framework đang cố cập nhật tất cả các trường trong SQL. – Hengyi

+1

@Tôi và tại sao đó là một vấn đề nếu đó là cùng một dữ liệu đó là cùng một dữ liệu – msarchet

+0

Vấn đề là trang có thể có một số thực thể con. Ví dụ: thực thể Person và thực thể con Person.Address. Nếu người dùng chỉ cập nhật các trường trên thực thể Person, chỉ cần nghĩ rằng chúng ta không nên cập nhật thực thể Person.Address. – Hengyi

3

Vâng, nếu bạn chỉ định thuộc tính, thì Khung thực thể sẽ cho bạn biết bạn đang làm gì và cập nhật nó. Bạn đang nói rằng người dùng chỉ thay đổi một trường, nhưng tôi không chắc chắn cách MVC hoặc Entity Framework được cho là biết rằng, trong tất cả các cặp keyvalue trong biểu mẫu HTML đã đăng, chỉ một thực tế đã được người dùng thay đổi . Bạn đang nói, trong câu hỏi của bạn, rằng "các giá trị đã không được thay đổi", nhưng trong nhận xét của bạn về câu trả lời của @ jchapa bạn nói rằng "không phải tất cả thông tin đều giống nhau". Điều này cho thấy vấn đề thực tế không phải với những gì mà Entity Framework đang làm, mà đúng hơn là những gì bạn đang nói.

Tôi nghĩ rằng có lẽ bạn đang tìm kiếm giải pháp sai chỗ.

Nếu vấn đề thực sự của bạn là mô hình được chuyển đến hành động chứa các trường mà người dùng không bao giờ thay đổi và không bao giờ được cập nhật (có thể vì họ không thực sự ở dạng), bạn có thể chuyển danh sách trắng đến TryUpdateModel.

Nếu vấn đề thực sự của bạn là một người dùng khác có thể đã thay đổi cá thể Person giữa thời gian người dùng gửi yêu cầu GET cho biểu mẫu và thời gian người dùng đã đăng thay đổi, thì bạn có thể thêm trường TIMESTAMP vào bảng và đặt chế độ đồng thời cố định trên đó.

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