【问题标题】:keyword not supported data source关键字不支持数据源
【发布时间】:2010-11-27 02:49:35
【问题描述】:

我有一个带有默认成员数据库的 asp.net-mvc 应用程序。我正在通过 ADO.NET Entity Framework 访问它。

现在我想将其移至 IIS,但出现了几个问题。我必须安装 SQL Server Management Studio,创建新数据库,从以前的 .MDF 文件中导入所有数据。唯一剩下要做的事情(据我所知)是更改为连接字符串。但是,我对此并没有真正的经验,并且不断获得不支持的关键字:“数据源”。例外。这是我的连接字符串:

<add name="ASPNETDBEntities" 
     connectionString="Data Source=MONTGOMERY-DEV\SQLEXPRESS;Initial Catalog=ASPNETDB;Integrated Security=True;" 
     providerName="System.Data.EntityClient" />

任何想法,有什么问题?

【问题讨论】:

  • 当我选择了错误的启动项目时,我遇到了这个错误,因此 VS 无法找到我的连接字符串。确保选择了带有 app.config 的启动项目。

标签: asp.net entity-framework connection-string


【解决方案1】:

您拥有的是一个有效的 ADO.NET 连接字符串 - 但它不是一个有效的实体框架连接字符串。

EF 连接字符串如下所示:

<connectionStrings> 
  <add name="NorthwindEntities" connectionString=
     "metadata=.\Northwind.csdl|.\Northwind.ssdl|.\Northwind.msl;
      provider=System.Data.SqlClient;
      provider connection string=&quot;Data Source=SERVER\SQL2000;Initial Catalog=Northwind;Integrated Security=True;MultipleActiveResultSets=False&quot;" 
      providerName="System.Data.EntityClient" /> 
</connectionStrings>

您的 EF 连接字符串中缺少所有 metadata=providerName= 元素......您基本上只有 provider connection string 部分中包含的内容。

使用 EDMX 设计器应该在您的 web.config 或 app.config 中为您创建一个有效的 EF 连接字符串。

马克

更新:好的,我了解您要执行的操作:您需要第二个“ADO.NET”连接字符串,仅用于 ASP.NET 用户/成员数据库。你的字符串没问题,但是 providerName 是错误的——它必须是“System.Data.SqlClient”——这个连接不使用 ENTity Framework——那就不要为它指定“EntityClient”!

<add name="ASPNETMembership" 
     connectionString="Data Source=MONTGOMERY-DEV\SQLEXPRESS;Initial Catalog=ASPNETDB;Integrated Security=True;" 
     providerName="System.Data.SqlClient" />

如果您指定providerName=System.Data.EntityClient ==> Entity Framework 连接字符串(带有元数据= 和所有内容)。

如果您需要并指定providerName=System.Data.SqlClient ==> 直接 ADO.NET 不添加所有 EF 的 SQL Server 连接字符串

【讨论】:

  • 事实上,确实如此,但是我得到了异常无法打开物理文件“C:\OVSS\Staviky\trunk\Stavicky\App_Data\aspnetdb.mdf”。操作系统错误 5:“5(无法检索此错误的文本。原因:15105)”。尝试为文件 C:\OVSS\Staviky\trunk\Staviky\App_Data\aspnetdb.mdf 附加自动命名数据库失败。存在同名数据库,或无法打开指定文件,或位于 UNC 共享上。从某些来源,我认为这是错误的。无论如何,谢谢。
  • 我不确定我是否理解第二个连接字符串问题。我应该让设计师生成的那个并添加你写给我的 ASPNETMembership?
  • 如果您在 EDMX 设计器中有实体 - 需要通过“EntityClient”和 EF 连接字符串来访问这些实体。如果您使用“开箱即用”的 ASP.NET 会员系统,它不是您的 EF 模型的一部分,因此当您为 ASP.NET 会员数据库创建连接字符串时,您不能使用“EntityClient”作为提供者 - 使用 SqlClient。
  • 所以是的 - 你需要两个 - EDMX 系统为你生成的 EF 连接字符串,PLUS 第二个 - 普通 ADO.NET 连接字符串 - 用于 ASP.NET会员制度。
  • @marc_s 有用的答案,但您可以明确表示,如果您使用的是实体框架,则无法将提供程序名称更改为 System.Data.SqlClient 并删除 EF 相关部分。至少这是我在病房使用 EF6 的经验。你可能会问为什么要这样做?在另一个引用连接以进行读取的应用程序中,起初使用简单的 ADO 样式连接字符串似乎是合乎逻辑的。
【解决方案2】:

当您通过索引引用 web.config(或 app.config)连接字符串时,可能会出现此问题...

var con = ConfigurationManager.ConnectionStrings[0].ConnectionString;

从零开始的连接字符串并不总是在您的配置文件中,因为它是inherits others by default from further up the stack

推荐的方法是按名称访问您的连接...

var con = ConfigurationManager.ConnectionStrings["MyConnection"].ConnectionString;

或者先清除配置文件中的 connnectionStrings 元素...

<connectionStrings>
    <clear/>
    <add name="MyConnection" connectionString="...

【讨论】:

    【解决方案3】:

    我遇到了同样的问题。
    但是这段代码很好用,试试吧。

    <add name="MyCon" connectionString="Server=****;initial catalog=PortalDb;user id=**;password=**;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />
    

    【讨论】:

      【解决方案4】:

      我遇到了同样的错误,然后更新了我的连接字符串,如下所示,

      <add name="EmployeeContext" connectionString="data source=*****;initial catalog=EmployeeDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
      

      试试这个,它会解决你的问题。

      【讨论】:

        【解决方案5】:

        我在开始使用 Entity Framework 时遇到了这个问题,它发生在我没有将旧的 SQL 服务器连接更改为 EntityFrameWork 连接时。

        解决方案: 在通过 web.config 文件建立连接的文件中 "add name="Entities" connectionString=XYZ", 确保您指的是正确的连接,就我而言,我必须这样做

                public static string MyEntityFrameworkConnection
            {
                get
                {
                     return ConfigurationManager.ConnectionStrings["Entities"].ConnectionString;
                }
        
            }
        

        在需要建立连接时调用 MyEntityFrameworkConnection。

        private string strConnection= Library.DataAccessLayer.DBfile.AdoSomething.MyEntityFrameworkConnection;
        

        注意:web.config 文件中的连接将在添加实体模型到解决方案时自动生成。

        【讨论】:

          【解决方案6】:

          我知道这是一篇旧帖子,但我最近遇到了同样的错误,所以对于它的价值,这是另一个解决方案:

          这通常是连接字符串错误,请检查您的连接字符串的格式,您可以查找“实体框架连接字符串”或按照上面的建议进行操作。

          但是,在我的情况下,我的连接字符串很好,错误是由完全不同的东西引起的,所以我希望这对某人有所帮助:

          1. 首先我遇到了 EDMX 错误:EDMX 中有一个新的数据库表,而我的数据库中不存在该表(有趣的是错误不是很明显因为它没有显示在我的 EDMX 或输出窗口中,而是隐藏在 Visual Studio 中“警告”下的“错误列表”窗口中)。我通过将缺少的表添加到我的数据库来解决此错误。但是,我实际上正忙于尝试添加存储过程并且仍然收到“数据源”错误,所以请参阅下面我是如何解决它的:

          2. 存储过程错误:我试图添加一个存储过程,但每次通过 EDMX 设计窗口添加它时都会出现“数据源”错误。解决方案是将存储过程添加为空白(我保留了存储过程名称和声明,但删除了存储过程的内容并将其替换为“选择 1”并重新尝试将其添加到 EDMX)。有效!大概 EF 不喜欢我的存储过程中的某些东西。将 proc 添加到 EF 后,我就可以将数据库上 proc 的内容更新为我想要的内容并且它可以正常工作,“数据源”错误已解决。

          怪异

          【讨论】:

            【解决方案7】:

            如果对他人有帮助,还请检查连接字符串中的 providerName。根据 EF 上下文的编码方式,您可能需要 SqlClient 而不是 EntityClient

            providerName="System.Data.EntityClient"
            

            【讨论】:

              【解决方案8】:

              如果您将连接字符串直接提供给实体框架,请记住将两个 XML 转义码 &amp;quot; 字符更改为提供的字符串中的实际引号,否则可能会出现同样的错误。

              我正在使用单独的部分类文件覆盖连接字符串,以将 EF 连接字符串传递给其基类。

                  // Partial class to use instead of generated version
                  public partial class PartEntities : DbContext
                  {
                      // Use the full EF6 connection string as described in other comments here
                      // Note: This is only here for testing, will be keeping outside source code
                      const string fullEFconnectionString = "metadata= ...";
              
                      // Extra parameter differentiates constructor
                      public PartEntities(bool b)
                          : base(fullEFconnectionString.Replace("&quot;", "\""))
                      {
                      }
                  }
              

              所以无论在代码中我想访问数据库上下文的什么地方,我都会这样做 -

              using (var ctx = new PartEntities(true))
              {
                  // Code that uses the context goes here
              }
              

              【讨论】:

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