指定的命名连接要么在配置中找不到,要么不打算与 EntityClient 提供程序一起使用,要么无效

我有一个单实体框架对象,当我将它添加到我的项目中时,它是 connectionstringconnectionstring部分中添加到 app.config,但是当我想创建新的 entitycontext并使用这个 connectionstring时,会出现这个错误

94508 次浏览

我怀疑你的问题来自于这样一个事实: 你的解决方案中有不止一个项目,而包含实体框架内容(包括 edmx文件)的项目不是解决方案的启动项目。在这种情况下,即使连接字符串存在于 EFapp.config项目中,CLR 仍然无法在运行时找到它。例如,如果您的解决方案中有一个网站和 EF 项目,您需要将 EF 项目的 app.config连接字符串复制到您的网站的 web.config。基本上,任何连接字符串数据都应该存在于项目的配置文件中。由 CLR 发起的 Net 线程(即您的启动项目)。 如果这不是您的情况,那么只需打开您的 edmx文件,右键单击它的表面,选择属性,复制连接字符串并将其粘贴到您的 app.config连接字符串部分。通过这种方式,您可以确保在您的配置中有正确的配置。

编辑:
你可以在这里看到 在 ObjectContext 构造函数 上的文档中,第一个参数是 Connectionstring 名称,它是在创建 EDM 时生成的代码。如果您的 Connectionstring 名称发生了变化,您所需要做的就是右键单击您的模型并选择 “从数据库更新模型...”,然后按照向导更新您的连接和设计器以反映这一变化。

当我试图将自定义数据库逻辑放入。我的解决方案中的多个项目将使用 dll。

虽然。Dll 有正确的 app.config 文件,但它不工作。实体框架需要在。前任。将信息复制到那里工作得很好。

Morteza 的解决方案是将连接字符串直接粘贴到。Edmx 不适合我,因为它不允许我在其中粘贴值——尽管这正是我希望能够做到的。

您需要将 app.config 中的连接字符串复制到 web.config 中,或者将整个文件复制到显示输出的项目中。这是使用框架的条件之一。

我有一个类库也不想和 EF 一起工作。在我将 app.config (或者仅仅是 Connectionstring 部分)从类库复制到 exe 项目之后,连接工作得很好! 可能配置文件应该与 exe 项目在同一个文件夹中,因此没有找到。因此,在类库项目中使用配置文件时,一定要格外小心!

我只是发现,如果一个应用程序是创建在 IIS 从 VS2010两个层次的网站根这个错误将发生。不知道为什么会发生,需要进一步调查。 例如,如果您的应用程序位于此路径: /admin/advertiser,如果您的 IIS 站点中没有 /admin虚拟目录,则会出现错误。

我所做的只是在我的 .../intepub/wwwroot错误中创建了一个空的 admin目录。

您会发现,在执行上述步骤之前,无法开始调试。

过去我们的团队有这个问题,需要一些时间来记住,但这正是我们以前解决它的方式。

尽管 Morteza Manavi 的回答确实解决了这个问题,但另一种解决方案是动态构建连接字符串,并将其传递给 ObjectContext 的构造函数:

public static string CreateConnectionString()
{
var assemblyPath = Assembly.GetExecutingAssembly().Location;
string assemblyLocation = Path.GetDirectoryName(assemblyPath);
string dbPath = Path.Combine(assemblyLocation, "YourDatabase.sdf");
var sqlBuilder = new SqlConnectionStringBuilder { DataSource = dbPath };


var entityBuilder = new EntityConnectionStringBuilder
{
ProviderConnectionString = sqlBuilder.ConnectionString,
Provider = "System.Data.SqlServerCe.3.5",
Metadata = @"res://*/YourModel.csdl|
res://*/YourModel.ssdl|
res://*/YourModel.msl"
};


return entityBuilder.ToString();
}


// Snip...


var entityContext = new YourObjectContext(CreateConnectionString());

这样就不需要将连接字符串信息复制到启动项目的 app.config 中,至少在我的例子中,这是不需要的。

嗨,我有这个问题,它让我疯了。不管怎样,我终于知道问题出在哪儿了。首先你要做的是确保 app.configweb.config中的 connectionstrings是相同的。然后,您必须双击 .edmx文件,以便可以看到这些表。一旦你点击表格附近的任何地方,但不是在表格和属性。从下拉列表中选择 ConceptualEntityModel并搜索实体容器名称,并记住它。

接下来转到 edmx 文件的设计器并打开构造函数。(设计器是 edmx 文件的子文件夹) 构造函数在 BASE 参数中应该有两个参数

public DBEntities() : base("name=DBEntities", "DBEntities")
{
this.ContextOptions.LazyLoadingEnabled = true;
OnContextCreated();
}

这是其中之一。第一个参数应该包含 .edmx文件所在的项目文件的名称。第二个参数必须具有前面提到的属性中的实体容器名称。 不要忘记使用: base("", "")来安排所有的构造函数

至少那是我的问题,我的问题就这样解决了。我希望你能像这样解决你的问题。

我在这方面有一个变化,似乎没有人涵盖。

我有一个包含两个模型的主要项目,以及一个包含单元测试的测试项目。测试项目正在工作,但随后停止了在 OP 中提到的错误。我没有对 EDMX 文件进行任何重命名或移动。

很多建议都提到了比较.config 文件,但是我的项目根本没有。

最后,我将 app.config 文件从主项目复制到我的测试项目中,然后它工作了。我不知道这是否是正确的步骤,或者在添加其他模型时会出现可维护性问题,但至少我的单元测试现在再次正确运行了。

我忘记在连接字符串中添加 ProviderName = “ System.Data.EntityClient”作为属性

<add name="connectionName" connectionString="metadata=res://*/..." providerName="System.Data.EntityClient" />

而不是

<add name="connectionName" connectionString="metadata=res://*/..." />

我没有使用 Iier 架构,也遇到了同样的问题,但是这个帮助了我,希望这个能帮助你。 首先你有相同的 connection string在你的 libraries,你可以访问数据库像在 app.configweb.config 之后,只需在。Edmx ( model.context.cs )文件,现在你有两个构造函数一个是默认的,另一个是你刚刚添加的(重载)。

        public YourEntityName(string connString)
: base(connString)
{
}

嗯... ... 这个问题也可能是一个非常简单(愚蠢)的原因... ... 我从另一个项目复制了一个文件,却忘了更改 EntityDataSource 上的 ConnectionString... ... 因为我在项目开始时,发生在登录页面上,我以为它是配置上的东西,但只是错误的连接字符串名称(和 DefaultContainerName)。

所以我和 JetBrains Rider 也有类似的问题。我所做的就是使用 main函数旁边的绿色按钮。这导致上面的消息显示。如果我右键单击项目本身并单击 run,那么它就工作了。

不知道为什么这样工作,我假设这是因为 Rider 没有读取 app.config,如果运行单独的函数?