WPF和LINQ / SQL - 如何以及在何处跟踪更改?

时间:2009-12-16 01:54:57

标签: wpf linq-to-sql mvvm

我有一个使用MVVM模式构建的WPF应用程序:

  • 我的模型来自LINQ to SQL。
  • 我使用存储库模式抽象出DataContext。
  • 我的ViewModel引用了Model。
  • 在ViewModel上设置属性会导致该值写入模型。

如您所见,我的数据存储在我的模型中,因此我的DataContext会跟踪更改。

然而,in this question我读到了:

  

来自MSDN的指南   DataContext类的文档   是我建议遵循的:

     

通常,DataContext实例是   旨在持续一个“单位   工作“但你的应用程序定义   那个词。 DataContext是   轻便且不贵   创建。典型的LINQ to SQL   应用程序创建DataContext   方法范围或实例   昙花一现的成员   代表一组相关的逻辑   数据库操作。

如何跟踪您的更改?在你的DataContext中?在您的ViewModel中?别处?

2 个答案:

答案 0 :(得分:1)

当我编写这种软件时,我的虚拟机从未以任何方式引用数据模型。当你像这样结合他们时,你几乎嫁给了一个简单的双层解决方案,这个解决方案真的很难突破。

如果您完全断开DataContext与VM的连接并让它们独立生效,那么您的应用程序将变为:

  • 更可测试 - 您的虚拟机可以在没有datacontext的情况下进行测试
  • 数据层可能无状态 - 您可以轻松更改架构以采用无状态3层解决方案。
  • 能够轻松集成其他数据源 - 您的虚拟机可以优雅地包含自己的聚合和其他数据源的组合。

简而言之,是的,我建议在整个应用程序中将数据访问类与ViewModel对象分离。它可能会有更多的代码,但随着架构的灵活性,它将带来红利。

编辑:一旦他们越过分布边界,我就不会使用L2SQL对象的更改跟踪功能。这很快变成了一堆蠕虫 - 你可以花很多时间在视图模型中处理和提供数据模型的对象图 - 这不仅增加了ViewModel的复杂性,而且至少可以将ViewModel传递到数据库的架构。我没有这样做,而是让ViewModel变得纯粹。当它们被持久化时,您的服务层/存储库/ ViewModel和数据对象之间的转换是什么。这起初似乎很多工作,但除了简单的CRUD之外,这个设计很快得到了回报。

答案 1 :(得分:0)

但是,您管理程序内的数据,L2SQL生成的类的对象实例就像常规对象一样创建,而不使用任何数据上下文。 DataContext仅负责与数据库交互。

这些指南可能意味着您可以对L2SQL生成的类的对象执行任何操作,但不保留在它们与数据库之间传输数据的对象。您可以像任何其他类一样处理L2SQL类,您可以根据需要使用这些类,并具有从数据库读取和写入数据库的附加功能。

这是猜测。我不能说这个神奇短语的MSDN作者的头脑中有什么,但这个解释是有道理的。在整个程序的活动期间将数据存储在L2SQL生成的类对象中,并通过临时的DataContext对象与数据库同步。