通过WPF MVVM中不断刷新的存储库保持EF更改

时间:2015-10-27 09:46:07

标签: c# wpf entity-framework mvvm

使用MVVM处理WPF应用程序并由Entity Framework提供支持。出于可用性目的,我们非常希望允许用户多窗口此应用程序。但是,这可能会导致EF出现问题。如果我们坚持通常建议每个ViewModel创建一个Repository副本,并且有人打开同一个ViewModel的多个窗口,那么它可能导致" IEntityChangeTracker的多个实例"错误。

我们通过在获取新数据上下文的存储库上放置Refresh方法来解决这个问题,而不是单独使用具有自身问题的Singleton。然后我们在整个商店做这样的事情:

using (IRepository r = Rep.Refresh())
{
    r.Update(CurrentCampaign);
    r.SaveChanges();
}

哪个很好。但是,它会导致维持状态的问题。如果在用户使用对象时刷新上下文,则其更改将丢失。

我可以看到两种方法,这两种方式都有其自身的缺点。

  • 我们不断致电SaveChanges。这有可能通过持续的数据库调用来减慢应用程序的速度。此外,有时候我们不想存放不完整的物品。
  • 我们在加载时将EF对象复制到内存中,让用户使用它们,然后添加" Save"按钮将所有对象复制回EF对象并保存。我们可以用自动播放器做到这一点,但仍然看起来不必要了。

还有其他办法吗?

1 个答案:

答案 0 :(得分:1)

我认为将实体框架作为单例访问的存储库可能并不总是错误的。

如果你有一个场景,你有一个客户端存储库,即一个存储库,它是客户端应用程序的可执行文件的一部分,即由一个客户端使用,那么单例可能没问题。当然我会在服务器端使用单例。

我向Brian Noyes(微软MVP)询问了关于复数网站上“MVVM”课程的类似问题。

我问:“处理视图模型中使用的客户端服务的正确方法是什么?”

在他的回答中,他写道:“...我的大多数客户服务都是单身人士,并且在应用程序的生命周期中生活。”

此外,只要你有一个单身人士的界面,拥有单身人士并不会阻止你编写单元测试。

如果您使用依赖注入框架(请参阅标记注释),这对自己来说是一个好主意,更改为单例实例化只需对相应类的注入容器的设置执行小的更改。

相关问题