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

c# – 探索为每个使用它的ViewModel / Class提供DbContext的陷阱

发布时间:2020-12-15 07:46:22 所属栏目:百科 来源:网络整理
导读:我正在学习实体框架并在MVVM应用程序中使用它,其中每个ViewModel都使用DbContext进行数据访问.免责声明:在实际应用程序中,我知道ViewModel不应直接与数据访问层交互. 鉴于每个ViewModel都是通过维护与模型本身的关系来监视和操纵View的状态,我开始想知道旋
我正在学习实体框架并在MVVM应用程序中使用它,其中每个ViewModel都使用DbContext进行数据访问.免责声明:在实际应用程序中,我知道ViewModel不应直接与数据访问层交互.

鉴于每个ViewModel都是通过维护与模型本身的关系来监视和操纵View的状态,我开始想知道旋转多个DbContext对象的含义,以及像DBContext这样的东西最好留作单例 – 我很快找到答案的是“NO”.因此,如果共识是每个用户都有一个实例(如多个ViewModel的情况,或者你有什么),我仍然没有看到任何人提到这个问题的潜在问题.

详细说来,假设我有两个ViewModel,每个我创建一个Context(TestContext继承自DbContext),以在每个ViewModel的生命周期内维护数据访问活动:

public class MainWindowViewModel : ViewModelBase
{
    private TestContext db = new TestContext();
    ... other code follows (properties methods etc...)...
}

public class TestViewModel: ViewModelBase
{
    private TestContext db = new TestContext();
    ... other code follows (properties methods etc...)...
}

在每个课程中都有一个可以消费它的背景是否有任何陷阱?

嘲讽我的一个想法是,是否可能让任何一个上下文与另一个上下文不同步,这样一个ViewModel通过其上下文更加“最新”而具有比另一个更新的数据.我有兴趣知道这样的事情.

谢谢.

编辑

我不希望发现/涵盖所有情况,因为这对于编码的情况是独特的.我只是想知道是否有任何“前期”或明显的危险,我不知道自己是这个主题的新手.

解决方法

实体框架和扩展DbContext支持UnitOfWork设计模式.这个想法是你保持逻辑“交易”分开.因此,您通常希望应用程序的每个部分或功能都处理自己的DbContext实例.

您可以考虑的方式是DbContext保存从数据库中提取的任何内容的本地副本,并跟踪用户对本地数据所做的所有更改.当你准备好了,你告诉它一次性将所需的更改推回到数据库.

关于坑洼和危险的问题;实体框架默认使用所谓的乐观并发.这意味着在将本地更改保存回数据库时,根本不会检查并发性.无论您的应用程序中的其他用户或其他上下文是否更改了它,您在本地DbContext中拥有的内容都将被发送回数据库.可以在这里找到一篇很好的文章,解释这个以及如何改变行为:
http://msdn.microsoft.com/en-us/library/bb738618.aspx

(编辑:李大同)

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

    推荐文章
      热点阅读