【发布时间】:2018-05-17 09:27:45
【问题描述】:
几个月来,我一直在使用 WPF MVVM 和实体框架编写应用程序,我意识到我的代码架构开始变得混乱。我似乎无法找到一种方法将 EF 和 WPF 正确连接在一起,同时保持两层不同且连贯的数据。
实体总是分离的,因为保持它们的连接意味着我们必须为整个应用程序保留一个 DbContext 实例,不推荐这样做。
目前,这是我的架构:
- 大部分写入操作都放在从不占用的服务中 实体作为参数,只有它们的 ID。
- ViewModel 调用服务,但由于未附加实体,因此未更新视图
- ViewModel 直接从 DbContext 检索数据,根据需要显示的内容选择要包含的属性
问题:
- 感觉不对。我觉得我没有正确使用 EF,这让我感到厌烦。
- 我最终得到了很多具有未定义属性的实体实例(我不能总是包含所有这些,这会消耗太多内存)
- 我的 ViewModel 中有 EF 代码
除了非常基本的教程之外,我似乎也无法在网上找到任何合适的 WPF - EF 架构示例。
例子:
class ViewModel : BaseViewModel
{
private Service _service;
public ViewModel(Service service)
{
LoadEntities();
}
public IList<Entity> Entities { get; set; }
private void LoadEntities()
{
using(var context = new DbContext())
{
Entities = context.Entities
.Include("Reference.Foo")
.ToList();
}
}
private void DeleteEntity(Entity entity)
{
_service.DeleteEntity(entity.Id);
Entities.Remove(entity);
}
}
【问题讨论】:
-
所以你已经积累了几个月的问题。恭喜,但是关于查找教程的问题不在 StackOverflow 上。熟悉tour
-
有很多相关的例子和教程。事实上,所有显示在 MVVM 架构中使用 ORM 的东西。从问题来看,您似乎不了解 MVVM 是什么或它是如何工作的:
since the entities are not attached, the view is not updated为什么您不将 ViewModel 绑定到视图?这是他们的工作,而不是调用服务。ViewModels retrieve their data directly from a DbContext:不,视图模型是从加载的数据(模型)创建的,并绑定到视图,从而强制自动更新 -
@Panagiotis Kanavos 对不起,我不擅长用英语解释事情。我添加了一个代码示例。虚拟机绑定了视图
-
@Romain 大多数课程和教程做展示了如何从数据库加载数据。您的代码没有显示 INotifyPropertyChanged 的实现,但绑定不起作用。
-
@Romain 我建议您查看 Pluralsight 的 Building an Enterprise App with WPF, MVVM, and Entity Framework Code First 课程。您可以通过 Visual Studio Dev Essentials 计划获得 3 个月的免费访问权限
标签: c# wpf entity-framework