【问题标题】:EntityFramework, AppHarbor and configuration variablesEntityFramework、AppHarbor 和配置变量
【发布时间】:2012-04-13 09:23:03
【问题描述】:

我在使用 EntityFramework(数据库优先)和 AppHarbor 时遇到了一些问题。

我正在尝试使用 AppHarbor 插入到 web.config 中的配置字符串(我已将元数据添加到网站上的 Sequelizer 配置选项中),并且我正在尝试使用代码添加一些附加值提供。

目前我是一个非常糟糕的人,并且将字符串直接嵌入到我的应用程序配置提供程序中 - 如果托管服务提供商在我们身上切换数据库,那就不好了,所以我希望以正确的方式做到这一点并使用值 AppHarbor通过 web.config 提供。

这是 AppHarbor 提供的字符串(已删除密码和服务器详细信息):

metadata='res://*/MyDataEntities.csdl|res://*/MyDataEntities.ssdl|res://*/MyDataEntities.msl;';provider=System.Data.SqlClient;provider connection string='Server=servername.sequelizer.com;Database=databasename;User ID=username;Password=<snip>;'

如果“按原样”使用,则会产生以下错误:

The specified metadata path is not valid. A valid path must be either an existing directory, an existing file with extension '.csdl', '.ssdl', or '.msl', or a URI that identifies an embedded resource.

然后,我使用以下代码(摘自 AppHarbor 支持讨论之一)添加 EF 所需的额外内容...

          if (String.IsNullOrWhiteSpace(ProductionDatabaseConnectionString))
            {
                // Get it on first read and cache it
                var configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
                var connectionString = configuration.ConnectionStrings.ConnectionStrings["SQLAppHarbor001"].ConnectionString;
                // Add the required extra metadata for EF4.x
                if (!connectionString.Contains("MultipleActiveResultSets=True;"))
                    connectionString += "MultipleActiveResultSets=True;";
                if (!connectionString.Contains("App=EntityFramework;"))
                    connectionString += "App=EntityFramework;";
                configuration.ConnectionStrings.ConnectionStrings["SQLAppHarbor001"].ConnectionString = connectionString;
                configuration.Save();
                ProductionDatabaseConnectionString = connectionString;
            }
            return ProductionDatabaseConnectionString;

生成的连接字符串如下:

metadata='res://*/MyDataEntities.csdl|res://*/MyDataEntities.ssdl|res://*/MyDataEntities.msl;';provider=System.Data.SqlClient;provider connection string='Server=servername.sequelizer.com;Database=databasename;User ID=username;Password=<snip>;'MultipleActiveResultSets=True;App=EntityFramework;

但这会产生错误:

Format of the initialization string does not conform to specification starting at index 165.

索引 165 是“提供者连接字符串”的开始。

我使用嵌入的工作连接字符串,目前可以正常工作,是:

metadata='res://*/MyDataEntities.csdl|res://*/MyDataEntities.ssdl|res://*/MyDataEntities.msl;';provider=System.Data.SqlClient;provider connection string='Server=servername.sequelizer.com;Database=databasename;User ID=username;Password=<snip>;multipleactiveresultsets=True;App=EntityFramework'

唯一真正的区别是“multipleactiveresultsets=True;App=EntityFramework”条目位于“provider connection string”字符串内部而不是外部。

其他人似乎在 AppHarbor 上使用提供的配置变量很好地使用 EntityFramework,那么我做错了什么?

【问题讨论】:

    标签: entity-framework appharbor


    【解决方案1】:

    更新:现在可以使用 Sequelizer 管理面板为注入的连接字符串启用多个活动结果集 (MARS)。这是推荐的方法,因为不再需要修改 web.config,这会导致在启动期间重新加载 AppDomain

    我今天遇到了这个问题!我做了以下事情:

    var configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
    var connectionString = configuration.ConnectionStrings.ConnectionStrings["ConnStringAlias"].ConnectionString;
    if (!connectionString.Contains("multipleactiveresultsets=True;"))
    {
        connectionString = connectionString.TrimEnd('\'');
        connectionString = connectionString += "multipleactiveresultsets=True;\'";
        configuration.ConnectionStrings.ConnectionStrings["ConnStringAlias"].ConnectionString = connectionString;
        configuration.Save();
    }
    

    MultipleActiveResultSets 属性必须在 provider connection string 内,这就是您收到有关连接字符串格式错误的原因。

    我看到了一些“解决方案”,但似乎没有一个对我有用,包括 support page 底部的解决方案,关于如何在 AppHarbor 的网站上做到这一点。提供的解决方案甚至将应用程序送入无限循环,因为每次保存web.config 文件时应用程序都会重新启动,这在示例中是每次。

    【讨论】:

    • 感谢您的回答-我按照您的建议进行操作,但问题是您假设要修改的部分始终位于您收到的字符串的末尾:)最后,我从不费心对值进行硬编码,因为我得到保证,他们的 SQL 服务器提供程序从未在没有足够通知的情况下切换它们的连接字符串 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多