我有一个使用MVVM模式构建的WPF应用程序:
如您所见,我的数据存储在我的模型中,因此我的DataContext会跟踪更改。
然而,in this question我读到了:
来自MSDN的指南 DataContext类的文档 是我建议遵循的:
通常,DataContext实例是 旨在持续一个“单位 工作“但你的应用程序定义 那个词。 DataContext是 轻便且不贵 创建。典型的LINQ to SQL 应用程序创建DataContext 方法范围或实例 昙花一现的成员 代表一组相关的逻辑 数据库操作。
如何跟踪您的更改?在你的DataContext中?在您的ViewModel中?别处?
答案 0 :(得分:1)
当我编写这种软件时,我的虚拟机从未以任何方式引用数据模型。当你像这样结合他们时,你几乎嫁给了一个简单的双层解决方案,这个解决方案真的很难突破。
如果您完全断开DataContext与VM的连接并让它们独立生效,那么您的应用程序将变为:
简而言之,是的,我建议在整个应用程序中将数据访问类与ViewModel对象分离。它可能会有更多的代码,但随着架构的灵活性,它将带来红利。
编辑:一旦他们越过分布边界,我就不会使用L2SQL对象的更改跟踪功能。这很快变成了一堆蠕虫 - 你可以花很多时间在视图模型中处理和提供数据模型的对象图 - 这不仅增加了ViewModel的复杂性,而且至少可以将ViewModel传递到数据库的架构。我没有这样做,而是让ViewModel变得纯粹。当它们被持久化时,您的服务层/存储库/ ViewModel和数据对象之间的转换是什么。这起初似乎很多工作,但除了简单的CRUD之外,这个设计很快得到了回报。
答案 1 :(得分:0)
但是,您管理程序内的数据,L2SQL生成的类的对象实例就像常规对象一样创建,而不使用任何数据上下文。 DataContext仅负责与数据库交互。
这些指南可能意味着您可以对L2SQL生成的类的对象执行任何操作,但不保留在它们与数据库之间传输数据的对象。您可以像任何其他类一样处理L2SQL类,您可以根据需要使用这些类,并具有从数据库读取和写入数据库的附加功能。
这是猜测。我不能说这个神奇短语的MSDN作者的头脑中有什么,但这个解释是有道理的。在整个程序的活动期间将数据存储在L2SQL生成的类对象中,并通过临时的DataContext对象与数据库同步。