Có bao giờ là một ý tưởng hay để làm việc trực tiếp với ngữ cảnh không? Ví dụ: giả sử tôi có cơ sở dữ liệu về khách hàng và người dùng có thể tìm kiếm theo tên, hiển thị danh sách, chọn danh sách, sau đó chỉnh sửa thuộc tính của khách hàng đó.Thực thể tốt nhất và thực hành tốt nhất của WPF
Có vẻ như tôi nên sử dụng ngữ cảnh để nhận danh sách khách hàng (ánh xạ tới POCO hoặc CustomerViewModels
) và sau đó đóng ngay lập tức ngữ cảnh. Sau đó, khi người dùng chọn một trong số CustomerViewModels
trong danh sách, phần thuộc tính khách hàng của giao diện người dùng sẽ điền.
Tiếp theo, họ có thể thay đổi tên, loại, địa chỉ trang web, kích thước công ty, v.v. Sau khi nhấn nút lưu, tôi mở ngữ cảnh mới, sử dụng ID từ CustomerViewModel
để truy xuất hồ sơ khách hàng đó và cập nhật từng tính chất của nó. Cuối cùng, tôi gọi SaveChanges()
và đóng ngữ cảnh. Đây là rất nhiều công việc.
Câu hỏi của tôi là tại sao không chỉ làm việc trực tiếp với bối cảnh để nó mở trong suốt? Tôi đã đọc bằng cách sử dụng bối cảnh tương tự với một phạm vi lâu dài là rất xấu và chắc chắn sẽ gây ra vấn đề. Giả định của tôi là nếu ứng dụng sẽ chỉ được sử dụng bởi MỘT người tôi có thể rời khỏi bối cảnh mở và làm mọi thứ. Tuy nhiên, nếu có nhiều người dùng, tôi muốn duy trì một đơn vị công việc ngắn gọn và do đó mở và đóng ngữ cảnh theo yêu cầu.
Mọi đề xuất? Cảm ơn.
@PGallagher - Cảm ơn bạn đã trả lời kỹ lưỡng.
@Brice - đầu vào của bạn cũng hữu ích là
Tuy nhiên, @Manos D. nhận xét 'thu nhỏ của mã dự phòng' liên quan đến tôi một chút. Hãy để tôi đi qua một ví dụ. Cho phép nói rằng tôi đang lưu trữ khách hàng trong cơ sở dữ liệu và một trong những thuộc tính khách hàng của tôi là CommunicationMethod.
[Flags]
public enum CommunicationMethod
{
None = 0,
Print = 1,
Email = 2,
Fax = 4
}
Giao diện người dùng cho trang quản lý khách hàng trong WPF sẽ chứa ba hộp kiểm theo phương thức liên lạc của khách hàng (In, Email, Fax). Tôi không thể ràng buộc mỗi hộp kiểm với enum đó, nó không có ý nghĩa. Ngoài ra, điều gì sẽ xảy ra nếu người dùng nhấp vào khách hàng đó, hãy thức dậy và đi ăn trưa ... ngữ cảnh ngồi đó hàng giờ đồng hồ. Thay vào đó, đây là quá trình suy nghĩ của tôi.
Người dùng cuối chọn khách hàng từ danh sách. Tôi mới lên một bối cảnh, thấy rằng khách hàng và trả về một CustomerViewModel, sau đó bối cảnh được đóng lại (tôi đã để lại kho lưu trữ ra cho đơn giản ở đây).
using(MyContext ctx = new MyContext())
{
CurrentCustomerVM = new CustomerViewModel(ctx.Customers.Find(customerId));
}
Bây giờ người dùng có thể kiểm tra/bỏ chọn các nút In, Email, Fax khi chúng được ràng buộc với ba thuộc tính bool trong CustomerViewModel, cũng có phương thức Save(). Đây rồi.
public class CustomerViewModel : ViewModelBase
{
Customer _customer;
public CustomerViewModel(Customer customer)
{
_customer = customer;
}
public bool CommunicateViaEmail
{
get { return _customer.CommunicationMethod.HasFlag(CommunicationMethod.Email); }
set
{
if (value == _customer.CommunicationMethod.HasFlag(CommunicationMethod.Email)) return;
if (value)
_customer.CommunicationMethod |= CommunicationMethod.Email;
else
_customer.CommunicationMethod &= ~CommunicationMethod.Email;
}
}
public bool CommunicateViaFax
{
get { return _customer.CommunicationMethod.HasFlag(CommunicationMethod.Fax); }
set
{
if (value == _customer.CommunicationMethod.HasFlag(CommunicationMethod.Fax)) return;
if (value)
_customer.CommunicationMethod |= CommunicationMethod.Fax;
else
_customer.CommunicationMethod &= ~CommunicationMethod.Fax;
}
}
public bool CommunicateViaPrint
{
get { return _customer.CommunicateViaPrint.HasFlag(CommunicationMethod.Print); }
set
{
if (value == _customer.CommunicateViaPrint.HasFlag(CommunicationMethod.Print)) return;
if (value)
_customer.CommunicateViaPrint |= CommunicationMethod.Print;
else
_customer.CommunicateViaPrint &= ~CommunicationMethod.Print;
}
}
public void Save()
{
using (MyContext ctx = new MyContext())
{
var toUpdate = ctx.Customers.Find(_customer.Id);
toUpdate.CommunicateViaEmail = _customer.CommunicateViaEmail;
toUpdate.CommunicateViaFax = _customer.CommunicateViaFax;
toUpdate.CommunicateViaPrint = _customer.CommunicateViaPrint;
ctx.SaveChanges();
}
}
}
Bạn có thấy điều gì sai về điều này không?
Câu trả lời hay. Cảm ơn bạn đã trả lời: câu trả lời của một thành viên nhóm EF luôn có giá trị ở đây. – JYL