【问题标题】:How to modify the Connection String for EF6 when using Prism and different Modules使用 Prism 和不同模块时如何修改 EF6 的连接字符串
【发布时间】:2018-03-03 16:02:56
【问题描述】:

想在我的 Prism MVVM WPF 应用程序中使用带有 EF6 的 SQL。由于我是 EF6 的新手,我首先制作了一个可以正常工作的简单示例。在这个示例中,我使用一个模块并有 3 个文件夹用于 Views、ViewModels 和 Models,后者包含 SQL 内容。

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

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

System.Data.Entity.Core.MetadataException: '指定的元数据路径无效。有效路径必须是现有目录、扩展名为“.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。我还添加了对“数据”项目的引用。

【问题讨论】:

  • 如果您的 EDMX 文件位于文件夹 Models/Data/SQL 中(我从您的描述中了解到) - 使用 metadata=res://*/Models.Data.SQL.DB01.csdl... (对于 ssdl 和 msl 也是如此)。所以基本上你的 edmx 文件所在的所有子文件夹都用点分隔。
  • 我试过了,之前的错误信息消失了,取而代之的是不同的信息。似乎上面描述的问题已经解决了。我收到的消息如下。 System.Data.Entity.Core.MetadataException:“无法加载指定的元数据资源。”不过感谢您的提示。我自己绝对不会想到它,这次似乎能够找到数据库,所以我想这是一个改进。糟糕的是在其他地方失败了......
  • 这很可能意味着连接字符串仍然错误。尝试阅读本文以解决此问题:craigstuntz.com/posts/…。但首先确保您的模型名为“DB01”并且位于文件夹“SQL”中,该文件夹位于文件夹“Data”中,该文件夹位于项目根目录中的文件夹“Models”中。如果没有 - 修复它。
  • 这里有 PowerCut。无论如何,现在回来。我通过使用一般符号使它工作。资源://*/;现在已经足够好了,但正如文章中所述,它确实减慢了速度。不过,还不太确定正确的符号有什么问题。我将在稍后阶段回到这一点。非常感谢您在这方面的帮助和指导。
  • 好的,现在解决了。 Evk 之前给出的第一个答案是正确的,这基本上解决了手头的问题。还有一个我没有注意到的不相关的问题。视图模型中的命名空间不正确。我确实在一个文件夹中放置了 2 个模块,但这个文件夹不包含在命名空间中。那没问题。但是,如果您在视图中执行此操作,您还需要在视图模型中执行此操作。避免使用前面提到的短符号;资源://*/;这大大减慢了速度。如何在这些 cmets 中将您的答案标记为正确答案?

标签: c# wpf entity-framework mvvm prism-6


【解决方案1】:

以上至少有 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”文件夹中的假设。这两个文件夹又在同一个根目录下。因此,如果您使用其他文件夹来组织项目,请记住 NameSpace 不应反映实际的文件夹结构,而应反映上述结构以使 ViewModelLocator 正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    • 2014-02-05
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多