使用 Prism 和不同模块时如何修改 EF6 的连接字符串

How to modify the Connection String for EF6 when using Prism and different Modules

想在我的 Prism MVVM WPF 应用程序中将 SQL 与 EF6 结合使用。由于我是 EF6 的新手,所以我首先制作了一个运行良好的简单示例。在此示例中,我使用了一个模块,并为 Views、ViewModels 和 Models 创建了 3 个文件夹,后者包含 SQL 内容。

所以我将这个概念转化为我的 Prism 应用程序。这里我有一个不同的结构。一个 'Root' 模块,引导程序位于根目录中,MainShell 及其视图模型分别位于 Views 和 ViewModels 文件夹中。我有一个包含 2 个项目的文件夹模块。在项目 'Data' 中,我的 EF 逻辑位于 'SQL' 文件夹中。在项目 'MainView' 中,我在文件夹 'Views' 和 'ViewModels' 中分别有 MainView 和 MainViewModel。现在,当我编译时,我收到以下消息:“在应用程序配置文件中找不到名为 'Entities01' 的连接字符串”。

然后我将配置字符串添加到 'Root' 模块和 'MainView' 模块的配置文件 (App.config) 中。我还更新了路径以反映新位置。但我现在收到一条不同的错误消息。

System.Data.Entity.Core.MetadataException: 'The specified metadata path is not valid. A valid path must be either an existing directory, an existing file with extension '.csdl'、'.ssdl' 或 '.msl',或标识嵌入资源的 URI。'

对我来说,这表明我没有正确更改路径。

原始(由 EF6 创建)连接字符串如下:

  <connectionStrings>
    <add name="Entities01" connectionString="metadata=res://*/SQL.DB01.csdl|res://*/SQL.DB01.ssdl|res://*/SQL.DB01.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=DESKTOP-14K5J6E\DB01;initial catalog=NLTrader01;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

我将上面的代码修改为以下以反映新位置:

  <connectionStrings>
    <add name="Entities01" connectionString="metadata=res://*/Data/SQL.DB01.csdl|res://*/Data/SQL.DB01.ssdl|res://*/Data/SQL.DB01.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=DESKTOP-14K5J6E\DB01;initial catalog=NLTrader01;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

我不知道如何解决这个问题。是我的方法不对还是我只是在新路径中打错了字?

我确实添加了 using 指令。我还向所有项目添加了 EF6。我还添加了对 'Data' 项目的引用。

以上至少有2个答案。感谢 Evk 的第一个回答并指导我了解更多信息。

我个人比较喜欢下面的回答。

<connectionStrings>
    <add name="Entities01" connectionString="metadata=res://*/Data.SQL.DB01.csdl|res://*/Data.SQL.DB01.ssdl|res://*/Data.SQL.DB01.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=DESKTOP-14K5J6E\DB01;initial catalog=NLTrader01;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

但是也可以使用以下表示法。

<connectionStrings>
    <add name="Entities01" connectionString="metadata=res://*/;provider=System.Data.SqlClient;provider connection string=&quot;data source=DESKTOP-14K5J6E\DB01;initial catalog=NLTrader01;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

我注意到这个解决方案比第一个解决方案慢得多。

根据 MS 文档,我了解到还有另一种解决方案应该会稍微快一些,但我还没有弄清楚,一旦我弄清楚了,我会把它添加到解决方案中。

还有一个我忽略的问题。

将 Prism 与 Prism ViewModelLocator 一起使用时,请记住它正在文件夹 'ViewModels' 中寻找 ViewModel。 ViewModelLocator 的工作原理基于以下假设:View 始终位于 'Views' 文件夹中,而 ViewModel 始终位于 'ViewModels' 文件夹中。这 2 个文件夹再次位于同一根目录中。因此,如果您使用其他文件夹来组织您的项目,请记住命名空间不应反映实际的文件夹结构,而应反映上述结构以使 ViewModelLocator 正常工作。