Tôi cần đặt EntityKey của EntityObject. Tôi biết loại của nó và giá trị id của nó. Tôi không muốn truy vấn cơ sở dữ liệu một cách không cần thiết.EntityKey và ApplyPropertyChanges()
này hoạt động ...
//
// POST: /Department/Edit/5
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Guid id, Department Model)
{
Model.EntityKey = (from Department d in db.Department
where d.Id == id
select d).FirstOrDefault().EntityKey;
db.ApplyPropertyChanges(Model.EntityKey.EntitySetName, Model);
db.SaveChanges();
return RedirectToAction("Index");
}
này thất bại ...
//
// POST: /Department/Edit/5
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Guid id, Department Model)
{
String EntitySetName = db.DefaultContainerName + "." + Model.GetType().Name;
Model.EntityKey = new System.Data.EntityKey(EntitySetName, "Id", Model.Id);
db.ApplyPropertyChanges(Model.EntityKey.EntitySetName, Model);
db.SaveChanges();
return RedirectToAction("Index");
}
Các ApplyPropertyChanges() dòng không thành công với ngoại lệ này:
Các ObjectStateManager không chứa một ObjectStateEntry với tham chiếu đến một đối tượng thuộc loại 'Sample.Models.Department'.
Hai EntityKey là bằng nhau. Tại sao khối thứ hai của mã không thành công? Làm thế nào tôi có thể sửa chữa nó?
+1 cho phương pháp mở rộng. Đó là khá! =) Phương thức này sẽ thay đổi như thế nào nếu bảng sử dụng PK nhiều cột? –
Bạn sẽ cần phải thực hiện quá tải của phương pháp mở rộng đã mất một IEnumerable của KeyValuePair để xác định khóa, và sau đó gọi quá tải constructor tương ứng trên EntityKey. Để duy trì sự an toàn stype và tránh đi qua các chuỗi trong KeyValuePair của bạn, bạn có thể vượt qua một mảng các đại biểu 'tìm kiếm chính' cùng với các giá trị để đưa vào các khóa. –
Dựa trên câu trả lời tuyệt vời này, tôi đã cải thiện nó một chút và tạo ra một phương pháp nhỏ của riêng tôi, và tôi cũng đăng tải câu trả lời. Nó hoạt động cho bất kỳ loại đối tượng thực thể nào và không sử dụng các đại biểu. –