Использование EntityFramework: контекст для докладчика или шаблон длинного разговора для приложений Windows Forms? - PullRequest
3 голосов
/ 28 ноября 2011

Пока я не использовал MVP и попробовал шаблон длинного разговора, подобный этому:

private void SaveItem(object sender, EventArgs e)
{
    using (var transaction = _businessTransactionFactory.Create())
    {
        var currentMobileDevice = GetCurrentMobileDevice();

        if (currentMobileDevice.Id == Guid.Empty)
        {
            transaction.MobileDeviceRepository.Save(currentMobileDevice);
        }
        else
        {
            transaction.MobileDeviceRepository.Update(currentMobileDevice);
        }

        transaction.Commit();
        LoadData(transaction);
    }
}

private MobileDevice GetCurrentMobileDevice()
{
    return (MobileDevice)MobileDevicesBindingNavigator.BindingSource.Current;
}

Проблемы, с которыми я столкнулся:

  • Мне всегда приходится работать с отдельными сущностями.
  • Работа с отделенными объектами EntityFramework заставляет обновлять ВСЕ столбцы вместо тех, которые изменяются:

    public void Update(T entity)
    {
        if (_objectContext.ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Detached)
        {
            _objectSet.Attach(entity);
            _objectContext.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
        }
    }
    

Как вы обрабатываете контекст в приложении Windows Forms?

Что такое плюсы и минусы обоих?

Ответы [ 2 ]

1 голос
/ 02 декабря 2011

Взгляните на эту статью: http://msdn.microsoft.com/en-us/library/ff714955.aspx Здесь показан один из подходов к использованию репозитория и шаблона единицы работы с EF. Вместо того, чтобы использовать реализацию unitofwork непосредственно в своем докладчике, сделайте инъекцию в конструктор IUnitOfWork с контейнером IoC, таким как castle.windsor. Помимо чистой и масштабируемой архитектуры, у вас будет одно очень приятное преимущество: castle.windsor предлагает вам (как это делают большинство IoC-фреймворков) варианты времени жизни для зарегистрированных компонентов, например, singleton или transient. поэтому вам потребуется всего одна строка кода, чтобы изменить время жизни всех докладчиков, реализующих IUnitOfWork. Вы сможете инициировать каждого докладчика с отдельным экземпляром unitofwork или с тем же экземпляром.

вам нужен пример кода? Кстати, я работаю над примером github с открытым исходным кодом для реализации EF в масштабируемой архитектуре. Я разговаривал со Скоттом Алленом из команды ADO.NET. Он будет участвовать.

С уважением, Ули

1 голос
/ 28 ноября 2011

Типичным сценарием является новый контекст для докладчика, где докладчик может обрабатывать более одного представления в случае разных представлений для одних и тех же данных.Об этом есть очень хорошая статья в журнале MSDN.Он нацелен на сессию NHibernate, но управление контекстом EF должно следовать тому же подходу, чтобы точно решить проблемы, с которыми вы сталкиваетесь с отсоединенными сущностями.

...