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

时间:2010-08-16 06:58:08

标签: entity-framework entity-framework-4

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

11 个答案:

答案 0 :(得分:216)

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

修改
正如你在这里看到的那样 Documenation on ObjectContext Constructor,第一个参数是连接字符串名称,它是您在创建EDM时生成的代码。如果以某种方式更改了您的连接字符串名称的名称,您只需右键单击您的模型并选择“从数据库更新模型...”然后按照向导进行更新你的困惑和设计师反映这种变化。

答案 1 :(得分:31)

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

答案 2 :(得分:9)

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

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

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

答案 3 :(得分:6)

嗨,我有这个问题,这让我疯了。无论如何最后我弄清楚问题是什么。您要做的第一件事是确保connectionstringsapp.config中的web.config相同。然后,您必须双击.edmx文件,以便查看表格。一旦你点击桌子附近的任何地方,但没有点击桌子,然后转到属性。从下拉列表中选择ConceptualEntityModel并搜索实体容器名称并记住它。

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

中有两个参数
public DBEntities() : base("name=DBEntities", "DBEntities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

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

排列所有构造函数

Atleast这是我的问题,我的问题就这样解决了。我希望你能解决这个问题。

答案 4 :(得分:6)

我对此有一个变化,似乎没有人覆盖。

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

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

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

答案 5 :(得分:4)

尽管Morteza Manavi' answer确实解决了这个问题,但另一个解决方案是动态构建连接字符串并将其传递给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的需要,至少在我的情况下,这是不可取的。

答案 6 :(得分:4)

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

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

而不是

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

答案 7 :(得分:2)

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

我所做的一切都是在admin错误消失的情况下创建了一个空的.../intepub/wwwroot目录。

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

我们团队过去遇到过这个问题,需要花一些时间才能记住,但这正是我们之前修复过的问题。

答案 8 :(得分:1)

我有一个不想使用EF的类库。将app.config(或者只是connectionstring部分)从我的类libraray复制到exe项目后,连接工作正常! 可能配置文件应与exe项目位于同一文件夹中,因此未找到。因此,当在类库项目中使用配置文件时,总是要格外警惕!

答案 9 :(得分:1)

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

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

答案 10 :(得分:0)

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