我有一个实体框架对象,当我将它添加到我的项目时,connectionstring
已添加到app.config
部分的connectionstring
,但是当我想创建新的entitycontext
并使用此connectionstring
时,会出现此错误
答案 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)
嗨,我有这个问题,这让我疯了。无论如何最后我弄清楚问题是什么。您要做的第一件事是确保connectionstrings
和app.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.config
和web.config
中访问数据库
之后你只需在.edmx(Model.context.cs)文件中添加一个重载的构造函数,现在你有两个构造函数是默认的,另一个是你刚刚添加(重载)。
public YourEntityName(string connString)
: base(connString)
{
}
答案 10 :(得分:0)
嗯...这个问题也可能是由于一个非常简单的原因导致的...我从另一个项目复制了一个文件,却忘记了更改EntityDataSource上的ConnectionString ...就像我刚开始时一样项目,并发生在登录页面上,我以为是配置中的内容,但是连接字符串名称(和DefaultContainerName)错误。