Như một kịch bản rất thô sơ, chúng ta hãy hai hoạt động sau đây:dài sống Entity Framework bối cảnh - thực hành tốt nhất để tránh toàn vẹn dữ liệu phát hành
UserManager.UpdateFirstName(int userId, string firstName)
{
User user = userRepository.GetById(userId);
user.FirstName = firstName;
userRepository.SaveChanges();
}
InventoryManager.InsertOrder(Order newOrder)
{
orderRepository.Add(newOrder);
orderRepository.SaveChanges();
}
Tôi chỉ có sử dụng EF trong các dự án web và phụ thuộc nhiều vào bản chất không quốc tịch của web. Với mọi yêu cầu, tôi sẽ nhận được một bản sao mới của bối cảnh được chèn vào các đối tượng mặt tiền lớp kinh doanh của tôi (dịch vụ, người quản lý, bất kỳ thứ gì bạn muốn gọi cho họ), tất cả các nhà quản lý kinh doanh chia sẻ cùng một ngữ cảnh của EF. Hiện tại tôi đang làm việc trên một dự án WPF và tôi đang tiêm các nhà quản lý kinh doanh và sau đó là các kho lưu trữ mà họ sử dụng trực tiếp vào Mô hình Xem.
Giả sử người dùng đang ở trên màn hình phức tạp và lần nhấp nút đầu tiên của họ gọi phương thức UpdateFirstName(). Giả sử SaveChanges() không thành công vì bất kỳ lý do gì. Nhấn nút thứ hai của họ sẽ gọi phương thức InsertOrder().
Trên web, đây không phải là vấn đề vì bối cảnh hoạt động # 2 không liên quan (yêu cầu http mới) đến ngữ cảnh được sử dụng bởi thao táC# 1. Trên máy tính để bàn tuy nhiên, đó là bối cảnh tương tự trên cả hai hành động. Vấn đề phát sinh trong thực tế là tên đầu tiên của người dùng đã được sửa đổi và như vậy được theo dõi bởi bối cảnh. Mặc dù SaveChanges() ban đầu không có (nói db không có sẵn tại thời điểm đó), thao tác thứ hai gọi SaveChanges() sẽ không chỉ chèn thứ tự mới, nó cũng sẽ cập nhật tên người dùng đầu tiên. Chỉ là về mọi nguyên nhân, điều này không được mong muốn, vì người dùng từ lâu đã quên mất hành động đầu tiên của họ. Điều này rõ ràng là một ví dụ ngớ ngẩn, nhưng tôi luôn có xu hướng gặp phải những tình huống như thế này, tôi ước rằng tôi có thể bắt đầu mới với bối cảnh mới cho mọi hành động của người dùng trái ngược với cuộc sống lâu dài hơn (cho cuộc đời của cửa sổ WPF chẳng hạn).
Các bạn xử lý các tình huống này như thế nào?
Dennis, trên thực tế câu hỏi của tôi là về một ngữ cảnh cho mỗi cửa sổ, tôi thậm chí không cân nhắc chia sẻ nó trên bất cứ điều gì nhiều hơn thế. Tôi chỉ đơn giản là tự hỏi về "nhà nước" mà bối cảnh duy trì cho cuộc sống của cửa sổ. Nhiều cửa sổ có các hoạt động không liên quan, một số có thể bị lỗi, một số khác chúng tôi chỉ muốn từ bỏ (sau khi sửa đổi một số thực thể được theo dõi bởi ngữ cảnh, nhưng không gọi Savechang). Nó cảm thấy đúng với tôi để duy trì một bối cảnh cho mỗi cửa sổ cách tiếp cận, tôi chỉ không thấy làm thế nào nó thực sự có thể làm việc cho tôi mà không gây ra vấn đề toàn vẹn dữ liệu vô tận. – e36M3
Được rồi, đọc lại câu hỏi gốc của bạn và bình luận của bạn, EF có một số cách để đối phó với thất bại và dọn dẹp, bằng cách làm mới các thực thể (với các tùy chọn khác nhau về những người chiến thắng liên quan đến sửa đổi địa phương). –
Thực tế là nó có Denis, tuy nhiên trừ khi bạn đang chơi trực tiếp với bối cảnh trong View Model của bạn trái ngược với việc trải qua một tầng kinh doanh chứa một kho chung chứa ngữ cảnh EF, nó gần như không thể sử dụng các tính năng như vậy. Tôi đoán tôi đã hy vọng có nhiều ý kiến về kinh nghiệm hơn. Tôi chắc rằng tôi không phải là người duy nhất không đi qua các dịch vụ WCF đến cơ sở dữ liệu. – e36M3