【发布时间】: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="data source=DESKTOP-14K5J6E\DB01;initial catalog=NLTrader01;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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="data source=DESKTOP-14K5J6E\DB01;initial catalog=NLTrader01;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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