加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在WPF MVVM中使用不断刷新的存储库来保持EF更改

发布时间:2020-12-15 22:22:20 所属栏目:百科 来源:网络整理
导读:使用MVVM处理 WPF应用程序并由Entity Framework提供支持.出于可用性目的,我们非常希望允许用户多窗口此应用程序.但是,这可能会导致EF出现问题.如果我们坚持通常建议每个ViewModel创建一个Repository副本,并且有人打开同一ViewModel的多个窗口,则可能导致“IE
使用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”课程的类似问题.

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

在他的回答中,他写道:“……无论如何,我的大多数客户服务都是单身人士,并为应用程序的生命而活.”

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读