关于实体框架:在配置中找不到指定的命名连接,不打算与EntityClient提供程序一起使用,或者无效

The specified named connection is either not found in the configuration, not intended to be used with the EntityClient provider, or not valid

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


我怀疑您的问题来自这样一个事实:您的解决方案中有多个项目,而包含实体框架内容(包括edmx文件)的项目不是解决方案的启动项目。在这种情况下,即使连接字符串存在于ef app.config项目中,但clr仍然无法在运行时找到它。例如,如果您的解决方案中有一个网站和一个ef项目,则需要将连接字符串从ef项目的app.config复制到您的网站的web.config。基本上,任何连接字符串数据都应该存在于由clr(即启动项目)启动的.NET线程的项目配置文件中。如果不是您的情况,那么只需打开您的edmx文件,右键单击其表面,选择属性并复制连接字符串并将其粘贴到您的app.config连接字符串部分。这样,您就可以确保配置中有正确的配置。< BR>< BR>编辑:< BR>正如你在这里看到的documenation在objectcontext构造函数上,第一个参数是connectionString名称,它是在创建EDM时生成的代码。如果您的connectionString名称碰巧发生了更改,您只需右键单击模型并选择"从数据库更新模型…",然后按照向导更新配置和设计器以反映此更改。


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


当我试图将自定义数据库逻辑放入.dll中以供解决方案中的多个项目使用时,遇到了这个问题。

虽然.dll有正确的app.config文件,但它不起作用。实体框架需要.exe的app.config中的连接信息。把信息复制到那里工作得很好。

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


我有一个变化,似乎没有人能涵盖。

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

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

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


嗨,我有这个问题,它让我发疯了。不管怎样,我终于明白了问题所在。你要做的第一件事就是确保app.configweb.config中的connectionstrings是相同的。然后您必须双击.edmx文件,以便可以看到表。一旦你点击了表附近的任何地方,而不是表上的任何地方,然后转到属性。从下拉列表中选择ConceptualEntityModel,搜索实体容器名称并记住它。

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

1
2
3
4
5
public DBEntities() : base("name=DBEntities","DBEntities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

这是其中之一。第一个参数应该具有.edmx文件所在的项目文件的名称。第二个参数必须具有前面提到的属性中的实体容器名称。别忘了用:base("","")来安排所有的施工人员。

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


我忘记在连接字符串中添加providername="system.data.entityclient"作为属性。这导致了这个错误,所以

1
 

而不是

1
 


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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中,至少在我的情况下,这是不可取的。


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

我所做的就是在我的.../intepub/wwwroot错误消失后,创建一个空的admin目录。

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

我们的团队在过去遇到过这个问题,需要一段时间来记住,但这正是我们以前解决这个问题的方法。


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

1
2
3
4
        public YourEntityName(string connString)
            : base(connString)
        {
        }

我有一个班级图书馆也不想和英孚合作。在我将app.config(或只是connectionString部分)从类libraray复制到exe项目后,连接工作正常!配置文件可能与exe项目位于同一文件夹中,因此找不到。所以在类库项目中使用配置文件时,一定要格外小心!