【问题标题】:Trouble with metadata in Entity Framework connection string实体框架连接字符串中的元数据问题
【发布时间】:2010-10-26 18:09:22
【问题描述】:

我有一个使用 RIA 服务的 Silverlight 4 应用程序,在该应用程序中,我将所有 RIA 服务特定的代码移到了一个名为“AppServices”的单独模块(WCF RIA 服务类库)中。我们将主应用程序称为“Silverlight4App”。我需要针对与存储其余数据的数据库不同的数据库对用户进行身份验证。我已将 EF 模型添加到 AppServices.Web,这也是身份验证服务当前所在的位置。 Web.config 文件位于主应用程序中,即 Silverlight4App 中。

在 web.config 文件的 connectionStrings 部分,我最初有这个:

<add name="AuthEntities" connectionString="metadata=res://*/AuthModel.csdl|res://*/AuthModel.ssdl|res://*/AuthModel.msl;provider=... />

我收到以下错误:

“查询'GetUser'的加载操作失败。无法加载指定的元数据资源。”

然后我尝试了各种方法,例如:

<add name="AuthEntities" connectionString="metadata=..\..\bin\AuthModel.csdl|..\..\bin\AuthModel.ssdl|..\..\bin\AuthModel.msl;provider=... />

得到了这个错误:

“查询“GetUser”的加载操作失败。指定的元数据路径无效。有效路径必须是现有目录、扩展名为“.csdl”、“.ssdl”或“.msl”的现有文件',或标识嵌入资源的 URI。”

我还尝试将元数据文件复制到不同的位置。最后,我进一步了解了以下内容。

<add name="AuthEntities" connectionString="metadata=~\..\..\..\Silverlight4App.Web\Metadata\AuthModel.csdl|~\..\..\..\Silverlight4App.Web\Metadata\AuthModel.ssdl|~\..\..\..\Silverlight4App.Web\Metadata\AuthModel.msl;provider=... />

使用上面的连接字符串,我得到以下错误:

“查询“GetUser”的加载操作失败。提供的连接字符串无效,因为它包含的映射或元数据信息不足。\r\n参数名称:connectionString 内部异常消息:无法确定应用程序上下文。ASP。 NET 应用程序路径无法解析。”

好吧,至少它似乎找到了元数据文件!出于沮丧,我终于尝试简单地硬编码元数据文件的整个路径:

<add name="AuthEntities" connectionString="metadata=C:\Users\...\Silverlight4App.Web\Metadata\AuthModel.csdl|C:\Users\...\Silverlight4App.Web\Metadata\AuthModel.ssdl|C:\Users\...\Silverlight4App.Web\Metadata\AuthModel.msl;provider=... />

效果很好!!不幸的是,这是一个糟糕的解决方案,尤其是当我去部署应用程序时。

我在硬编码尝试(见上文)之前尝试的尝试抱怨信息不足,但硬编码尝试指向完全相同的文件,这似乎很奇怪>,似乎包含足够的信息。嗯……

有什么想法吗?我当然可以使用一些帮助!

【问题讨论】:

    标签: silverlight entity-framework silverlight-4.0 forms-authentication wcf-ria-services


    【解决方案1】:

    用Reflector查看编译后的程序集,看看资源是否存在;如果是,则应该可以使用第一种方法访问它们。如果不是,那么您的部署有问题;当然,您始终可以选择将它们部署为松散文件。如果这没有帮助,请要求更多说明,我明天会在我的办公桌前拿着手头的代码进一步解释(前一段时间不得不处理类似的事情)。

    【讨论】:

    • Reflector 显示了元数据文件的命名空间限定名称。当我尝试将命名空间添加到文件名时,例如。 “res://*/Models.AuthModel.csdl”,它起作用了。谢谢你的提示,亚历克斯!!
    【解决方案2】:

    根据我的实验:通过文件系统访问时的元数据是通过Environment.CurrentDirectory 的相对路径完成的。如果有任何东西改变了这个值,如果从 exe 路径给出,它会弄乱你的相对路径。由于这个限制,使用嵌入式资源更稳定。

    注意:当编译为嵌入式资源时,完整的资源名称与通过EntityDeploy 编译 edmx 时不同。如果您仍然难以接受/找到元数据,请使用 ilasmreflector 提取已编译资源以确保资源名称...

    【讨论】:

      【解决方案3】:

      解决此问题的最佳方法是创建一个工厂来生成您的 EF 对象。工厂可以传入一个 edmxconnection 对象,该对象可以这样生成:(请原谅 VB)

      Public Shared Function GetEDMXConnectionString(Of T As ObjectContext)(Optional ByVal connectionString As String = "") As EntityConnection
        Dim dbConnection As New SqlConnection(connectionString)
        Dim resourceArray As String() = {"res://*/"}
        Dim assemblyList As Assembly() = {GetType(T).Assembly}
        Dim metaData As New MetadataWorkspace(resourceArray, assemblyList)
        Dim edmxConnection As New EntityConnection(metaData, dbConnection)
      
        Return edmxConnection
      End Function
      

      然后可以通过构造函数将该连接传递到 Context 实例中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-11
        相关资源
        最近更新 更多