关键字不支持数据源

92

我有一个使用默认成员身份验证数据库的ASP.NET MVC应用程序。我正在通过ADO.NET Entity Framework访问它。

现在我想将其移动到IIS,但出现了几个问题。我必须安装SQL Server Management Studio,创建新的数据库,并将所有数据从先前的.MDF文件导入到其中。我所知道的唯一剩下的事情就是更改连接字符串。然而,我并没有真正的经验,一直收到以下异常:

关键字不受支持:'data source'。

这是我的连接字符串:

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

有什么想法,错在哪里呢?


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

166

你所拥有的是一个有效的 ADO.NET 连接字符串,但它不是有效的 Entity Framework 连接字符串。

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设计器应该能够为你创建一个有效的EF连接字符串,在web.config或app.config文件中。
我理解你的意图:你需要一个第二个“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,那么使用带有 metadata= 和其他内容的实体框架(Entity Framework)连接字符串。

如果需要并且指定了 providerName=System.Data.SqlClient,那么使用不带有 EF 添加的直接 ADO.NET(SQL Server)连接字符串。


事实上,确实出现了这种情况,但是我收到了异常信息“无法打开物理文件'C:\ OVSS \ Stavicky \ trunk \ Stavicky \ App_Data \ aspnetdb.mdf'。操作系统错误5:“5(无法检索此错误的文本。原因:15105)”。尝试附加自动命名的数据库文件'C:\ OVSS \ Stavicky \ trunk \ Stavicky \ App_Data \ aspnetdb.mdf'失败。已存在同名数据库,或指定的文件无法打开,或位于UNC共享上。根据一些来源,我认为这是错误的。无论如何,谢谢。 - Trimack
我不确定我理解第二个连接字符串问题。我应该让设计师生成的那个保留,并添加你给我的ASPNETMembership吗? - Trimack
如果您的实体在EDMX设计器中,那么需要通过“EntityClient”和EF连接字符串来访问它们。如果您使用“开箱即用”的ASP.NET成员身份验证系统,则它不是您的EF模型的一部分,因此当您为ASP.NET成员身份验证数据库创建连接字符串时,不能使用“EntityClient”作为提供程序 - 使用SqlClient。 - marc_s
是的,你需要两个连接字符串 - 一个是由你的EDMX系统生成的EF连接字符串,再加上一个用于ASP.NET成员资格系统的普通ADO.NET连接字符串。 - marc_s
@marc_s的答案很有帮助,但你需要明确一点:如果你正在使用Entity Framework,那么你不能将提供程序名称更改为System.Data.SqlClient并删除EF相关部分。至少这是我在EF6及以上版本中的经验。你可能会问,为什么要这样做呢?在引用连接进行读取操作的附加应用程序中,一开始似乎使用简单的ADO样式连接字符串是有道理的。 - Atters
我已经将这个连接字符串(EF)添加到appsetting.json中,但它显示“数据源不是一个有效的关键字”。有什么想法吗? - RollerCosta

7
当您通过索引引用web.config(或app.config)连接字符串时,可能会出现此问题...
var con = ConfigurationManager.ConnectionStrings[0].ConnectionString;

零基础的连接字符串并不总是您配置文件中的那个,因为它默认从堆栈上方继承其他连接字符串
建议的方法是通过名称访问您的连接...
var con = ConfigurationManager.ConnectionStrings["MyConnection"].ConnectionString;

或者首先清除您配置文件中的connectionStrings元素...

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

3
如果您直接向实体框架提供连接字符串,请记得在提供的字符串中将两个XML转义代码&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
}

被低估的答案。谢谢。 - Frank Fu

3
我遇到了同样的问题。
但是这段代码运行良好,请尝试一下。
<add name="MyCon" connectionString="Server=****;initial catalog=PortalDb;user id=**;password=**;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />

1

我之前也遇到了同样的错误,后来更新了我的连接字符串如下:

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

尝试一下,它会解决你的问题。

0

当我开始使用实体框架时,我遇到了这个问题,因为我没有将旧的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文件中的连接将自动生成。


0
如果有帮助的话,请检查连接字符串中的providerName。根据EF上下文的编码方式,您可能需要使用SqlClient而不是EntityClient。
providerName="System.Data.EntityClient"

0

我知道这是一个旧帖子,但最近我遇到了同样的错误,所以就此提供另一种解决方案:

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

然而,在我的情况下,我的连接字符串没问题,错误是由完全不同的原因引起的,所以我希望这能帮助到某些人:

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

  2. 存储过程错误:我正在尝试添加一个存储过程,每次我通过EDMX设计窗口添加它时,都会出现“数据源”错误。解决方法是将存储过程添加为空白(我保留了存储过程名称和声明,但删除了存储过程的内容,并用“select 1”替换它,然后重试将其添加到EDMX)。它奏效了!可能是EF不喜欢我的存储过程中的某些东西。一旦我将存储过程添加到EF中,我就能够更新我的数据库中存储过程的内容,使其成为我想要的样子,它也奏效了,“数据源”错误得到了解决。

奇怪的事情


0
错误消息与错误的原因有关,关键字区分大小写。应该是“数据源”而不是“data source”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接