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


170

我有一个实体框架对象,当我将其添加到项目中时,该对象connectionstring 已添加到app.configconnectionstring节中,但是当我要创建新对象entitycontext并使用this时connectionstring,会出现此错误



4
感谢您的链接,克雷格。不过,我投票决定保留此线程,因为标题正是帮助我找到MetadataException错误的原因。
jp2code 2011年

当配置文件由于某种奇怪的原因未使用连接字符串更新时,这发生在我身上。
P.Brian.Mackey 2012年

Answers:


217

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

编辑:
正如您在ObjectContext Constructor上的文档上看到的 那样,第一个参数是连接字符串名称,它是创建EDM时生成的代码。如果以某种方式更改了连接字符串名称的名称,那么您要做的就是右键单击模型并选择“从数据库更新模型...”, 然后按照向导更新您的confing和设计器以反映此情况。更改。


1
嗨,Morteza,谢谢您的回答,但是我之前在web.config中复制了连接字符串sectin,但该错误没有解决,但是在entitymodel.designer中替换时(公共EntityContext():base(“ name = EntityContext”,EntityContext“ ))哪个连接
字符串

1
@Morteza,对于执行程序集没有app.config的项目,您有解决方案吗?就我而言,调用可执行文件是一个VB6应用程序,它通过COM Interop调用我的程序集(实体对象所在的位置)。
易腐的戴夫,

4
如此简单,却如此令人沮丧。上投票。Stackoverflow万岁!
granadaCoder 2012年

3
如果您使用的是WCF,请记住在服务项目中包括连接字符串
Nathan

1
谢谢Morteza,为我节省了很多时间!
克里斯,

32

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


1
只需在web.config(在前端项目中找到)中添加相同的连接字符串(如在数据访问项目中)。
2012年

@ Musikero31我使用EF并在代码中定义所有实体连接字符串。我没有任何相关的配置。
基思·比尔德

将DAL文件复制到新项目后,我也收到上述错误。仔细查看配置文件,我注意到连接字符串已被EF取代。我能够将正确的连接字符串手动复制/粘贴到新项目中,并且可以正常工作。
拉维·拉姆

9

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

虽然.dll具有正确的app.config文件,但该文件不起作用。实体框架需要.exe的app.config中的连接信息。将信息复制到那里就可以了。

Morteza将连接字符串直接粘贴到.edmx的解决方案对我不起作用,因为它不允许我在其中粘贴值-尽管这正是我想做的。


3
即使我的exe目录中只有一个app.config(并且是该​​目录中唯一的配置文件),它也不会读取它。我不得不重命名文件myExe.exe.config
Mario

6

嗨,我遇到了这个问题,这让我发疯了。无论如何,最后我弄清楚了问题所在。您要做的第一件事是确保connectionstringsin app.configweb.config相同。然后,您必须双击该.edmx文件才能看到表格。一旦您单击表附近但不在表上的任何位置,然后转到属性。从下拉列表中选择,ConceptualEntityModel然后搜索实体容器名称,并记住它。

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

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

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

那是我的问题,而我的问题就这样解决了。希望您能设法解决您的问题。


6

我对此有所不同,似乎没人能解决。

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

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

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


自从发布此文章以来,我意识到可能最好创建到另一个项目的app.config文件的链接。但是,即使根本没有配置文件,另一种方法也可以解决原始问题。
S. Baggy

4

尽管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的需要,至少在我看来,这是不希望的。


4

我忘记在连接字符串中添加providerName =“ System.Data.EntityClient”作为属性。这导致此错误,所以

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

代替

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

2

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

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

您将发现,只有执行上述步骤,才能开始调试。

我们过去在团队中遇到过这个问题,花了一些时间来记住,但这正是我们之前也解决过的问题。


1

我正在使用n'tier架构,但遇到了同样的问题,但这对我有帮助。希望对您有所帮助。首先,您可以connection stringlibraries其中访问数据库,就像在其中一样,app.config然后web.config 您只需在.edmx(Model.context.cs)文件中添加一个重载的构造函数,现在您有两个构造函数是默认的,而另一个是您刚刚添加的(超载)。

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

1

我有一个也不愿与EF一起使用的类库。在将我的类库中的app.config(或仅是connectionstring部分)复制到exe项目之后,连接工作正常!配置文件可能与exe项目位于同一文件夹中,因此未找到。因此,在类库项目中使用配置文件时,请务必格外小心!


0

嗯...这个问题也可能是由于一个非常简单的原因导致的...我从另一个项目复制了一个文件,却忘记更改EntityDataSource上的ConnectionString ...就像我在项目开始时一样,发生了在登录页面中,我认为这是配置中的内容,但只是错误的连接字符串名称(和DefaultContainerName)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.