使用EntityFramework:每个Presenter的上下文或Windows窗体应用程序的长对话模式?

时间:2011-11-28 09:28:44

标签: c# winforms entity-framework-4 mvp unit-of-work

现在我没有使用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;
}

我遇到的问题:

  • 我总是要与分离的实体一起工作。
  • 使用分离的entites强制EntityFramework更新所有列而不是更改的列:

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

如何处理Windows窗体应用程序中的上下文?

两者的专业缺点是什么?

2 个答案:

答案 0 :(得分:1)

典型情况是每个演示者的新上下文,其中演示者可以在相同数据的不同视图的情况下处理多个视图。在MSDN杂志中有关于此的非常nice article。它针对NHibernate的会话,但EF的上下文管理应遵循相同的方法来解决您遇到的与分离实体相遇的问题。

答案 1 :(得分:1)

看一下这篇文章:http://msdn.microsoft.com/en-us/library/ff714955.aspx 这向您展示了一种在EF中使用存储库和工作单元模式的方法。而不是直接在演示者中使用unitofwork实现,使用像Castle.windsor这样的IoC容器进行IUnitOfWork的构造函数注入。除了一个干净和可扩展的架构,你将有一个非常好的好处:castle.windsor为你提供(作为大多数IoC框架)注册组件的生命周期选项,例如singleton或transient。因此,只需一行代码即可更改实现IUnitOfWork的所有演示者的生命周期。您可以使用单独的单元实例或相同的实例来启动每个演示者。

您需要代码示例吗?顺便说一下,我正在开发一个开源的github示例,以便以一种干净的方式在可扩展的架构中实现EF。我和ADO.NET团队的Scott Allen谈过。他会参与其中。

亲切的问候, 乌利