我有一个实体框架对象,当我将其添加到项目中时,该对象connectionstring
已添加到app.config
本connectionstring
节中,但是当我要创建新对象entitycontext
并使用this时connectionstring
,会出现此错误
我有一个实体框架对象,当我将其添加到项目中时,该对象connectionstring
已添加到app.config
本connectionstring
节中,但是当我要创建新对象entitycontext
并使用this时connectionstring
,会出现此错误
Answers:
我怀疑您的问题是由于您的解决方案中有多个项目,而包含您的实体框架内容(包括edmx
文件)的项目不是解决方案的启动项目。在这种情况下,即使EF app.config
项目中存在连接字符串,CLR仍无法在运行时找到它。例如,如果您的解决方案中有一个网站和一个EF项目,则需要将连接字符串从EF项目的复制app.config
到网站的web.config
。基本上,任何连接字符串数据都应存在于CLR从.Net线程启动的项目(即您的启动项目)的配置文件中。如果这不是您的情况,那么只需打开您的edmx
文件,右键单击其表面,选择属性,然后复制连接字符串并将其粘贴到“ app.config
连接字符串”部分。这样,您可以确保配置中包含正确的配置。
编辑:
正如您在ObjectContext Constructor上的文档上看到的
那样,第一个参数是连接字符串名称,它是创建EDM时生成的代码。如果以某种方式更改了连接字符串名称的名称,那么您要做的就是右键单击模型并选择“从数据库更新模型...”, 然后按照向导更新您的confing和设计器以反映此情况。更改。
嗨,我遇到了这个问题,这让我发疯了。无论如何,最后我弄清楚了问题所在。您要做的第一件事是确保connectionstrings
in app.config
和web.config
相同。然后,您必须双击该.edmx
文件才能看到表格。一旦您单击表附近但不在表上的任何位置,然后转到属性。从下拉列表中选择,ConceptualEntityModel
然后搜索实体容器名称,并记住它。
接下来转到edmx文件的设计器并打开构造器。(设计器是edmx文件的子文件夹)构造函数在BASE参数中应具有两个参数
public DBEntities() : base("name=DBEntities", "DBEntities")
{
this.ContextOptions.LazyLoadingEnabled = true;
OnContextCreated();
}
这就是其中之一。第一个参数应该具有文件所在项目文件的名称.edmx
。第二个参数必须具有我前面提到的属性中的实体容器名称的名称。不要忘记用以下命令安排所有构造函数:base("", "")
那是我的问题,而我的问题就这样解决了。希望您能设法解决您的问题。
我对此有所不同,似乎没人能解决。
我有一个包含几个模型的主项目,一个包含单元测试的测试项目。测试项目正在运行,但随后由于OP中提到的错误而停止。我没有对EDMX文件进行任何重命名或移动。
很多建议都提到比较.config文件,但是我的项目根本没有。
最后,我将app.config文件从主项目复制到我的测试项目中,然后就可以了。我不知道这是正确的步骤,还是添加其他模型时会出现可维护性问题,但至少现在我的单元测试再次正常运行。
尽管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的需要,至少在我看来,这是不希望的。
我只是发现,如果从网站根目录的VS2010的两个级别在IIS中创建了一个应用程序,则会发生此错误。不知道为什么会发生,需要进一步调查。例如,如果您的应用程序位于此路径中:/admin/advertiser
如果/admin
IIS站点中没有虚拟目录,则会出现错误。
我所做的只是创建了一个空admin
目录,.../intepub/wwwroot
错误消失了。
您将发现,只有执行上述步骤,才能开始调试。
我们过去在团队中遇到过这个问题,花了一些时间来记住,但这正是我们之前也解决过的问题。
我正在使用n'tier架构,但遇到了同样的问题,但这对我有帮助。希望对您有所帮助。首先,您可以connection string
在libraries
其中访问数据库,就像在其中一样,app.config
然后web.config
您只需在.edmx(Model.context.cs)文件中添加一个重载的构造函数,现在您有两个构造函数是默认的,而另一个是您刚刚添加的(超载)。
public YourEntityName(string connString)
: base(connString)
{
}