刷新ViewModel的实体框架上下文

时间:2012-06-01 14:06:13

标签: wpf entity-framework unit-testing mvvm

我在我当前的项目中使用WPF,MVVM和Entity Framework。

为了简单起见,假设我有一个用于CRUD操作的视图模型,用于列出材料(实木)。

我的ViewModel的EF上下文( WTContext )是通过属性注入初始化的,例如:

SolidWoods_VM newView = new SolidWoods_VM();
newView.Context = new WTContext(SettingsManager.Instance.GetConnectionString());

这样我就可以测试这个ViewModel:

SolidWoods_VM swVM = new SolidWoods_VM();
swVM.Context = new FakeWTContext();

想象一下,在插入操作期间出现问题并且WTContext.SaveChanges()失败。 刷新ViewModels上下文的最佳方法是什么?

  1. 在名为 ForTestingPurposes 的viewmodel中创建一个新的bool属性,当SaveChanges方法失败时:

    try
    {
        Context.SaveChanges();
    }
    catch
    {
        if (!ForTestingPurposes)
        {
            Context = new WTContext(SettingsManager.Instance.GetConnectionString());
        }
    }
    
  2. 向mainviewmodel发送消息以进行上下文重新加载(通过中介模式):

    Mediator.Instance.NotifyColleagues<SolidWoods_VM>(MediatorMessages.NeedToUpdateMyContext, this);
    
  3. (但是,这样我仍然需要bool属性)

    3.为您提供更优雅的解决方案,没有附加属性:)

2 个答案:

答案 0 :(得分:1)

为什么不将数据上下文所需的方法/属性抽象到接口上,然后实现处理异常的实现。

//WARNING: written in SO window
public interface IDataSource
{
    void SaveChanges();
    //... and anything else you need ...
}

public class RealDataSource : IDataSource
{
    private WTContext _context;

    public void SaveChanges()
    {
        try { _context.SaveChanges(); }
        catch
        {
            _context = new WTContext(/*...*/);
        }
    }
}

通过这种方式,您仍然可以实现伪/模拟数据源,但您的视图模型类不需要知道有关如何实际检索数据的任何信息。

答案 1 :(得分:0)

我的观点是,你最好的选择就是留言。

您需要一种方法来指示保存出错,并且可能无法为该类的所有使用者提供重新生成的上下文。例如,如果您在那里绑定了VM,重置上下文可能会产生其他UI后果。