使用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窗体应用程序中的上下文?
的优点和缺点是什么?
典型的场景是每个演示者都有一个新的上下文,其中演示者可以处理多个视图,以防同一数据上有不同的视图。MSDN杂志上有一篇很好的文章。它的目标是NHibernate的会话,但EF的上下文管理应该遵循相同的方法来解决你遇到的分离实体的问题。
看看这篇文章:http://msdn.microsoft.com/en-us/library/ff714955.aspx这向您展示了在EF中使用存储库和工作单元模式的一种方法。不要在演示器中直接使用unitofwork实现,而是用IoC容器(如castle.windsor)注入IUnitOfWork的构造函数。除了一个干净和可扩展的架构,你将有一个非常好的好处:城堡。windsor为你提供了注册组件的生命周期选项(和大多数IoC框架一样),比如单例或瞬态组件。所以你只需要一行代码就可以改变实现IUnitOfWork的所有演示器的生命周期。您可以使用单独的unitofwork实例或相同的实例来初始化每个演示器。
你需要一个代码样本吗?顺便说一下,我正在做一个开源的github示例,以一种干净的方式在可扩展的架构中实现EF。我和联合行动处的斯科特·艾伦谈过了。净的团队。他将参加。
亲切的问候,乌里