快速修复使用多个实体框架上下文的ViewModel

本文关键字:框架 实体 上下文 ViewModel | 更新日期: 2023-09-27 18:03:33

目前正在使用MVVM模式开发MVC应用程序。它最初是这样编写的,所有的viewmodel都继承自同一个BaseViewModel,这就形成了一个单一的实体框架存储库,如下所示:

public abstract class BaseViewModel : INotifyPropertyChanged
{
    private static MyRepository _rep;
    protected static MyRepository rep
    {
        get
        {
            if (_rep == null)
                _rep = new MyRepository();
            return _rep;
        }
    }
}

我继承的应用程序实际上没有单元测试,所以我决定做一些重构,使它更易于测试。因此,我在存储库上放置了一个接口,并为每个视图模型提供了自己的副本,以便可以模拟测试:

public class MyViewModel : BaseViewModel
{
    private IMyRepository _rep;
    public AvailabilityHistoryViewModel()
        : this(new MyRepository())
    { }
    public MyViewModel(IMyRepository rep)
    {
        _rep = rep;
        DoStuff();
    }
}

这在大多数情况下是可以的。但后来我遇到了一个以前的功能按钮,突然导致应用程序崩溃,可怕的"实体对象不能被多个IEntityChangeTracker实例引用"错误。

结果是有一个UserControl在应用程序的几个地方使用,它也继承自BaseViewModel,因此有它自己的存储库副本。

public abstract class BaseTreeViewItem : BaseViewModel
{ }

当它在父视图模型中使用时,它的属性被传递,很可能会以一个EF对象结束,这个对象是用UserControl存储库创建的,被传递给viewmodel,并与它的存储库一起保存——这是因为它们是不同的上下文,导致崩溃。

简单的修复是简单地退出我的更改,并让使用这个UserControl的ViewModels返回到使用BaseViewModel存储库。但这是丑陋的。一个适当的修复,重新安排东西以便UserControl没有它自己的上下文,将会花费比我实际得到的更长的时间。还有别的办法吗?

快速修复使用多个实体框架上下文的ViewModel

我可能错过了一些东西,但在我看来,拥有单例存储库将解决您的问题。您已经通过接口使用了它们,所以您可以简单地注入它们。