使用MVVM处理 WPF应用程序并由Entity Framework提供支持.出于可用性目的,我们非常希望允许用户多窗口此应用程序.但是,这可能会导致EF出现问题.如果我们坚持通常建议每个ViewModel创建一个Repository副本,并且有人打开同一ViewModel的多个窗口,则可能导致“IEntityChangeTracker的多个实例”错误.
我们不是选择有自身问题的Singleton,而是通过在获取新数据上下文的存储库中放置Refresh方法来解决这个问题.然后我们在整个商店做这样的事情:
using (IRepository r = Rep.Refresh())
{
r.Update(CurrentCampaign);
r.SaveChanges();
}
哪个大部分都好.但是,它会导致维持状态的问题.如果在用户使用对象时刷新上下文,则其更改将丢失.
我可以看到两种方法,这两种方式都有其自身的缺点.
>我们不断致电SaveChanges.这有可能通过持续的数据库调用来减慢应用程序的速度.此外,有时我们不想存储不完整的对象.
>我们在加载时将EF对象复制到内存中,让用户使用它们,然后添加一个“保存”按钮,将所有对象复制回EF对象并保存.我们可以用自动播放器做到这一点,但似乎仍然是不必要的.
还有另外一种方法吗?
最佳答案 我认为将实体框架作为单例访问的存储库可能并不总是错误的.
如果你有一个场景,你有一个客户端存储库,即一个存储库,它是客户端应用程序的可执行文件的一部分,即由一个客户端使用,那么单例可能没问题.当然我不会在服务器端使用单例.
我问过Brian Noyes(微软MVP)关于复数网站上“MVVM”课程的类似问题.
我问道:“处理视图模型中使用的客户端服务的正确方法是什么?”
在他的回答中,他写道:“……无论如何,我的大多数客户服务都是单身人士,并为应用程序的生命而活.”
此外,只要你有一个单身人士的界面,拥有一个单身人士并不会阻止你编写单元测试.
如果您使用依赖注入框架(请参阅标记注释),这对于自身来说是一个好主意,更改为单例实例化只是对相应类的注入容器的设置执行小的更改.