Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 设计师问题+;实体框架(WPF MVVM)_C#_Wpf_Entity Framework_Mvvm - Fatal编程技术网

C# 设计师问题+;实体框架(WPF MVVM)

C# 设计师问题+;实体框架(WPF MVVM),c#,wpf,entity-framework,mvvm,C#,Wpf,Entity Framework,Mvvm,背景,这是一个WPF项目,它使用实体框架,当运行时工作正常,只是设计者给出了以下错误 未处理的异常 指定的命名连接在配置中找不到、不打算与EntityClient提供程序一起使用,或者无效 我已经处理了UI的连接字符串,但这仍然是一个问题 我有以下的装订 DataContext="{Binding Source={x:Static ViewModel:ViewModelLocator.MainWindowViewModelStatic}}" 它与初始化的类相关 new Mai

背景,这是一个WPF项目,它使用实体框架,当运行时工作正常,只是设计者给出了以下错误

未处理的异常 指定的命名连接在配置中找不到、不打算与EntityClient提供程序一起使用,或者无效

我已经处理了UI的连接字符串,但这仍然是一个问题

我有以下的装订

   DataContext="{Binding Source={x:Static ViewModel:ViewModelLocator.MainWindowViewModelStatic}}"
它与初始化的类相关

     new MainWindowViewModel(new UIDataProvider());
其中有以下几点

    private readonly IUIDataProvider _dataProvider;

    private IList<Customer> _customers;

    public IList<Customer> Customers
    {
        get
        {
            if (_customers == null)
            {
                GetCustomers();
            }
            return _customers;
        }
    }

    public MainWindowViewModel(IUIDataProvider dataProvider)
    {
        _dataProvider = dataProvider;

        Tools = new ObservableCollection<ToolViewModel>();
        Tools.Add(new AToolViewModel());
        Tools.Add(new BToolViewModel());
    }


    private void GetCustomers()
    {
        _customers = _dataProvider.GetCustomers();
    }
专用只读IUIDataProvider\u数据提供程序;
私人IList_客户;
公共IList客户
{
得到
{
如果(_customers==null)
{
GetCustomers();
}
退回客户;
}
}
公共主窗口视图模型(IUIDataProvider数据提供程序)
{
_数据提供者=数据提供者;
工具=新的ObservableCollection();
添加(新的AToolViewModel());
添加(新的BToolViewModel());
}
私人客户()
{
_customers=_dataProvider.GetCustomers();
}

设计者实际上在设计时实例化了您的代码。在实例化时,您的代码试图访问您的数据,因此实体框架代码在错误的位置查找连接字符串。解决方案是在设计模式下不这样做

最简单的方法是检查。这并不是真正的MVVM,因为您必须在视图模型中检查它,这会将UI代码注入到视图模型中


解决办法是什么?您只需捏住鼻子就可以了(快速而肮脏),创建一个可注入的接口,该接口从您的ViewModel中抽象出该检查,默认情况下,它是一个检查依赖属性的实现,或者捕获异常并优雅地接受它

如果我阅读正确,问题是_mainWindowViewModel=new mainWindowViewModel(new UIDataProvider());初始化公共类UIDataProvider时:IUIDataProvider{private NorthwindEntities\u NorthwindEntities=new NorthwindEntities();public IList GetCustomers(){return\u NorthwindEntities.Customers.ToList();}有什么方法可以使用空/伪版本吗?@user3532702:正如我所说的,问题是此代码正在设计器中运行。解决方案是不在设计器中运行代码。现在的问题应该是“我如何不在设计器中运行此代码”,我已经为您提供了答案(不是代码,而是概念)。您必须1.确定您不是在运行时,而是在设计时,2.不执行涉及数据库的代码。我给了您一个链接,告诉您如何在WPF应用程序中检测设计时。直接使用它,或从视图模型中抽象出来。@user3532702:旁注,您不必努力使用它。下面是在设计器中调用代码时,将返回
true
DesignerProperties.GetIsInDesignMode(new DependencyObject());
我按照说明更改了一些内容,效果很好,谢谢(!DesignerProperties.GetIsInDesignMode(new DependencyObject()){if(_northwindEntities==null){u northwindEntities=new northwindEntities();}返回_northwindEntities.Customers.ToList();}其他{@user3532702:旁注,请在下面的答案中添加信息,或者在添加更多详细信息时添加一般信息。因此,这不是一个论坛;问题应该包含问题,答案应该只是问题的答案。是的,我们对这方面有点不太了解:/