【问题标题】:EF 4.1 code-first connectionstring in web.configweb.config 中的 EF 4.1 代码优先连接字符串
【发布时间】:2011-07-26 15:27:14
【问题描述】:

我今天有点噩梦般的一天。我一直在本地成功地进行代码优先开发,并且在模型更改时,我的数据库被删除并根据需要重新创建,一切都进行得很好。但是,在尝试将项目“升级”到 mydiscountasp.net 上的 sqlserver2008 登台服务器时,我的问题就真正开始了。由于用户无法删除/重新创建共享主机数据库,因此我进行了本地备份并将其还原到服务器上。更近一步..当我通过 sqlserver mgt studio 登录服务器时,我可以看到数据库,一切看起来都很好。但是,我似乎无法弄清楚如何通过 web.config 连接到数据库。我开始使用简陋的 ado.net sysntax 作为连接字符串,如下所示:

<add name="MyWebSiteContext" 
  connectionString="Server=esql2k123.discountasp.net;
  Database=SQL2008R2_123456_test;uid=SQL2008R2_123456_test_user;pwd=mypassword;" 
  providerName="System.Data.SqlClient"/>

这不起作用,并给出了一个错误,指出无法识别关键字“服务器”。经过多次谷歌搜索,问题似乎很可能与providerName="System.Data.SqlClient" 部分有关。

所以在将其更改为providerName="System.Data.EntityClient" 时,我充满了一点希望。唉,同样的故事。

为了缩短(非常)长话短说,我尝试了许多排列(突变是有效的词!!:)),但似乎无法满足代码优先 ef 连接字符串要求的正确语法要求。

最近有没有人经历过类似的困境并找到了可行的解决方案?

手指、脚趾和眼睛 xx'd..

[更新]我已经设法让我的连接字符串(几乎)通过如下格式化:

<add name="GBCWebSiteContext" 
connectionString="Data Source=esql2k123.discountasp.net;Initial Catalog=SQL2008R2_123456_test;Persist Security Info=True;MultipleActiveResultSets=True;User ID=SQL2008R2_123456_test_user;Password=mypass" providerName="System.Data.SqlClient"/>

我现在可以在控制器操作执行 linq 选择时停止和调试它。但是,在尝试返回行时,我现在收到一个异常,它指出:触发器返回了一个结果集,并且服务器选项“禁止来自触发器的结果”为 true

那么,我在这里拼图的最后一块是什么,是连接字符串中的一个附加选项来否定这个问题吗??

[更新 2] 哈利路拉——我已经搞砸了。正如我已经删除了 global.asax 行:

Database.SetInitializer(new System.Data.Entity.DropCreateDatabaseIfModelChanges<MyWebSiteContext>());

我没有意识到我需要包含对Database.SetInitializer() 的空引用。

你瞧,以下是我的问题:

Database.SetInitializer<MyWebSiteContext>(null);

感谢大家的各种建议,他们帮助我专注于这个问题。好开心:)

【问题讨论】:

  • 您的本地连接字符串是什么样的?您可能会对其进行轻微修改,将其部署到暂存环境(稍后部署到生产环境)并让它再次运行。 EF 在连接字符串中需要相当多的元数据,所以我不会尝试从头开始手动编写。
  • Tomas- 本地连接字符串是基于 ef4.1 代码优先约定的连接字符串。即未在 web.config 中声明
  • 在你的 SQL Server 中,你能运行这个吗? exec sp_configure 'show advanced options',1;RECONFIGURE;exec sp_configure 'disallow results from triggers',1;RECONFIGURE;

标签: .net asp.net-mvc entity-framework-4 ef-code-first


【解决方案1】:

你试过数据源和初始目录吗?

sqlConnectionString="data source=myServer.myDomain.com;initial catalog=mydbName;user id=myUid;password=myPwd"

【讨论】:

  • Brian,是的,我之前也尝试过这条途径,收到一条消息:此操作需要连接到“主”数据库。无法创建到“主”数据库的连接,因为原始数据库连接已打开并且凭据已从连接字符串中删除。提供一个未打开的连接。
  • @Jim:这让我认为您在验证此数据库的凭据方面存在问题。当您在另一台服务器上恢复数据库时,这很常见,因为用户名的唯一 ID 被弄乱了。您是否尝试过在数据库上创建新用户名并确保可以从 SQL Management Studio 和您的应用程序连接到它?
  • hector,可以从 sqlmgtstud 连接。不能对应用程序说同样的话 - 仍然是一个很大的谜,没有真正的工具来追踪问题。非常令人沮丧,我可以向你保证。
  • 你试过在你的连接字符串之前放一个 吗?
【解决方案2】:

数据库服务器和网络服务器是否在同一个环境中?你试过Server=localhost;而不是Server=esql2k123.discountasp.net;吗?

或者,你能从网络服务器的位置找出数据库服务器的IP地址吗?

【讨论】:

  • 您好,我不认为(我可能错了)这是“服务器问题的位置”。这绝对是一个连接字符串的“语法”问题——99% 是肯定的。不过还是谢谢
  • 对于我的网站,我有:DataSource 而不是 Server,但如果它适用于您的本地开发...
  • tricat - 它只能在本地工作,因为我使用的是代码优先约定而不是配置,因此它默认为隐藏的“设置”。我去看看隐藏设置显示了什么。
【解决方案3】:

所以,本质上,我的问题的答案有两个:

  1. 连接字符串需要符合以下内容(只是粘贴连接字符串信息,其他所有内容与上面相同):

    connectionString="Data Source=esql2k123.discountasp.net;Initial Catalog=SQL2008R2_123456_test;Persist Security Info=True;MultipleActiveResultSets=True;用户 ID=SQL2008R2_123456_test_user;Password=mypass"

  2. global.asax Application_Start(或者与我的应用程序一样,ninject OnApplicationStarted())需要有一个空的Database.SetInitializer&lt;&gt;() 函数来清除现有的:

Database.SetInitializer(new System.Data.Entity.DropCreateDatabaseIfModelChanges&lt;MyWebSiteContext&gt;());

引起了问题。将其替换为 Database.SetInitializer&lt;MyWebSiteContext&gt;(null);

解决了批发问题。

感谢您分享旅程和您的想法,希望这将成为其他遇到类似问题的人的起点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    相关资源
    最近更新 更多