Tôi có mối quan hệ 1 .. * giữa Đánh giá và Đề xuất.ASP.NET MVC/EF4/POCO/Repository - Cách cập nhật mối quan hệ?
Phần liên quan của mô hình của tôi (mà cũng là POCO ánh xạ bởi EF4):
public class Review
{
public ICollection<Recommendations> Recommendations { get; set; }
}
Trên một Chỉnh sửa Xem, tôi đại diện cho Khuyến nghị như một tập hợp các hộp kiểm.
Khi tôi cố gắng và thêm một Khuyến nghị mới như một phần của biên tập Tạp chí (ví dụ như kiểm tra hộp khác), không có gì đang xảy ra - và tôi biết tại sao ...
tôi sử dụng "kỹ thuật sơ khai" để cập nhật các thực thể của tôi - ví dụ: tôi tạo một thực thể có cùng khóa, đính kèm nó vào biểu đồ, sau đó thực hiện ApplyCurrentValues
. Nhưng điều này chỉ hoạt động cho các thuộc tính vô hướng, không phải cho các thuộc tính điều hướng.
Tôi tìm thấy this StackOverflow question có vẻ tốt, nhưng tôi đang cố gắng tìm hiểu cách làm việc này với POCO's/Repository (và ngữ cảnh tách rời ASP.NET MVC).
Vì tôi đang sử dụng POCO, review.Recommendations
là ICollection<Recommendation>
, vì vậy tôi không thể làm review.Recommendations.Attach
. Tôi cũng không sử dụng các thực thể tự theo dõi, vì vậy tôi cần phải làm việc theo cách thủ công với theo dõi đồ thị/thay đổi - điều này đã không còn là vấn đề cho đến bây giờ.
Vì vậy, bạn có thể hình dung ra kịch bản:
Đánh giá:
- khuyến nghị (
ICollection<Recommendation>
):- RecommendationOne (
Recommendation
) - RecommendationTwo (
Recommendation
)
- RecommendationOne (
Nếu im trên chế độ xem chỉnh sửa, hai trong số các hộp kiểm đã được chọn. Phần thứ ba (đại diện cho RecommendationThree) là không được chọn.
Nhưng nếu tôi kiểm tra hộp đó, mô hình trên trở thành:
Đánh giá:
- khuyến nghị (
ICollection<Recommendation>
):- RecommendationOne (
Recommendation
) - RecommendationTwo (
Recommendation
) - Đề xuấtThree (
Recommendation
)
- RecommendationOne (
Và vì vậy tôi cần phải đính kèm RecommendationThree để đồ thị như một thực thể mới .
Tôi có cần các trường ẩn để so sánh dữ liệu đã đăng đối với thực thể hiện tại không? Hoặc tôi nên lưu trữ các thực thể trong TempData và so sánh với thực thể được đăng?
EDIT
Để tránh nhầm lẫn, đây là đầy đủ ứng dụng ngăn xếp cuộc gọi:
ReviewController
[HttpPost]
public ActionResult Edit(Review review)
{
_service.Update(review); // UserContentService
_unitOfWork.Commit();
}
UserContentService
public void Update<TPost>(TPost post) where TPost : Post, new()
{
_repository.Update(post); // GenericRepository<Post>
}
GenericRepository - sử dụng như GenericRepository<Post>
public void Update<T2>(T2 entity) where T2 : class, new()
{
// create stub entity based on entity key, attach to graph.
// override scalar values
CurrentContext.ApplyCurrentValues(CurrentEntitySet, entity);
}
Vì vậy, Update
(hoặc Add
hoặc Delete
) phương pháp Repository cần phải được gọi cho mỗi giới thiệu, tùy thuộc nó mới/sửa đổi/xóa.
chỉ thêm mục vào bộ sưu tập, tôi cũng cần thêm đối tượng đó vào biểu đồ. nhớ - bối cảnh tách rời, POCO, không có STE. trong những tình huống này, EF không biết rằng đề xuất này cần phải được thêm vào DB-i cần phải nói như vậy. – RPM1984
trả lời - chỉnh sửa. và làm cách nào để tôi biết * rằng đề xuất đó nên được thêm/sửa đổi/xóa? sao tôi cần phải so sánh tất cả các khuyến nghị "cũ" với những khuyến nghị mới? nhìn vào câu cuối cùng trong câu hỏi. – RPM1984
@jfar - câu hỏi đã chỉnh sửa. đọc chỉnh sửa của bạn - hãy nhớ sử dụng 'ApplyCurrentValues'. 'Đính kèm (đánh giá)' sẽ chỉ sửa đổi các giá trị vô hướng - không phải đề xuất. – RPM1984