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

本文关键字:窗体 Windows 应用程序 模式 对话 上下文 使用 EntityFramework | 更新日期: 2023-09-27 18:15:50

现在我没有使用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窗体应用程序中的上下文?

的优点缺点是什么?

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

典型的场景是每个演示者都有一个新的上下文,其中演示者可以处理多个视图,以防同一数据上有不同的视图。MSDN杂志上有一篇很好的文章。它的目标是NHibernate的会话,但EF的上下文管理应该遵循相同的方法来解决你遇到的分离实体的问题。

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

你需要一个代码样本吗?顺便说一下,我正在做一个开源的github示例,以一种干净的方式在可扩展的架构中实现EF。我和联合行动处的斯科特·艾伦谈过了。净的团队。他将参加。

亲切的问候,乌里