Хорошо ли работать с контекстом? Например, скажем, у меня есть база данных клиентов, и пользователь может искать их по имени, отображать список, выбирать один, а затем редактировать его свойства.
Кажется, я должен использовать контекст, чтобы получить список клиентов (сопоставленных с POCOs или CustomerViewModels
), а затем сразу закрыть контекст. Затем, когда пользователь выбирает один из CustomerViewModels
в списке, пользовательский раздел пользовательского интерфейса заполняется.
Затем они могут изменить имя, тип, адрес веб-сайта, размер компании и т.д. После нажатия кнопки сохранения я открою новый контекст, использую идентификатор из CustomerViewModel
для получения этой записи клиента и обновляю каждый его свойств. Наконец, я вызываю SaveChanges()
и закрываю контекст. Это много работы.
Мой вопрос: почему бы просто не работать напрямую с контекстом, оставив его открытым? Я прочитал, используя тот же контекст с большой продолжительностью жизни, очень плохо и неизбежно вызовет проблемы. Мое предположение - если приложение будет использоваться только ОДНИМ человеком, я могу оставить контекст открытым и сделать все. Однако, если будет много пользователей, я хочу поддерживать краткий блок работы и тем самым открывать и закрывать контекст для каждого запроса.
Любые предложения? Спасибо.
@PGallagher - Спасибо за подробный ответ.
@Brice - ваш ввод также полезен
Тем не менее, @Manos D. комментарий "олицетворения избыточного кода" меня немного беспокоит. Позвольте мне привести пример. Предположим, что я храню клиентов в базе данных, и одним из моих свойств клиента является CommunicationMethod.
[Flags]
public enum CommunicationMethod
{
None = 0,
Print = 1,
Email = 2,
Fax = 4
}
Пользовательский интерфейс для моей страницы клиентов-клиентов в WPF будет содержать три флажка по методу связи с клиентами (печать, электронная почта, факс). Я не могу привязать каждый флажок к этому перечислению, это не имеет смысла. Кроме того, что, если пользователь щелкнул этого клиента, встает и идет на обед... контекст сидит там часами, что плохо. Вместо этого это мой мысленный процесс.
Конечный пользователь выбирает клиента из списка. Я обновляю контекст, нахожу этого клиента и возвращаю CustomerViewModel, затем контекст закрывается (я оставил репозитории для простоты здесь).
using(MyContext ctx = new MyContext())
{
CurrentCustomerVM = new CustomerViewModel(ctx.Customers.Find(customerId));
}
Теперь пользователь может проверить/снять флажки с кнопок "Печать", "Электронная почта" и "Факс", поскольку они привязаны к трем свойствам bool в CustomerViewModel, который также имеет метод Save(). Здесь идет.
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();
}
}
}
Вы видите что-то не так с этим?