【问题标题】:ObjectContext in ViewModel (EF + MVVM)ViewModel 中的 ObjectContext (EF + MVVM)
【发布时间】:2013-03-26 19:22:44
【问题描述】:

我目前正在编写我的第一个 MVVM 应用程序,它使用 EntityFramework 进行数据访问。 应用程序严重依赖底层数据库,在许多情况下必须向数据库添加新数据。

但是,我不确定在 ViewModel 中调用 ObjectContext 是否是个好主意。 例如

public class SomeViewModel : ViewModelBase
{
    public IEnumerable<User> AllUsers { get; private set; }

    private void SomeMethod()
    {
        var __entities = new DatabaseEntities();
        AllUsers = __entities.Users.Where(...).ToList();
    }

}

我见过这样的解决方案,但随之而来的是一些问题。 例如 ObjectContext 实际存在多长时间,或者是否应该更喜欢单个、全局可访问的 ObjectContext。

或者像这样的调用不应该首先成为 VM 的一部分? 目前我还可以想象为每个 DB 表实现类似 StaticHelpers 并使用 GetAllUsers() 等方法。

在 Josh Smith 的关于 MVVM 的示例应用程序中,他使用了一个注入到每个 VM 的构造函数中的存储库。

public AllCustomersViewModel(CustomerRepository customerRepository)

尽管这必须是一个常见问题,但对于较小的应用程序如何解决此问题(最佳实践),我没有找到令人满意的答案?

【问题讨论】:

  • 我认为直接从您的视图模型中的方法调用 ObjectContect 意味着如果您没有可以由不同的视图模型访问的好 GetAllUsers() 方法(如果需要)。如果你没有这样的要求,那我觉得还可以。您可以将 DatabaseEntities 实例包装在 using 中。我认为您当前工作流程将面临的问题是管理 UI 更新。首先,您使用 IEnumerable 而不是 ObservableCollection,其次,您直接使用 EF User 类,而不是将其包装在实现 INPC 的 VM 中。

标签: wpf entity-framework mvvm viewmodel objectcontext


【解决方案1】:

在 MSDN 上的 DbContext 类的描述中,它声明了"Represents a combination of the Unit-Of-Work and Repository patterns",因此它可以充当您的存储库层,尽管它不是必须的,并且它旨在用于“工作单元”,它不适合为整个应用程序使用全局变量。除了为所有内容保留一个之外,还可能导致缓存数据和其他不良事物(内存使用等)出现问题。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多