C# EntityContainer名称必须是唯一的。名为';实体';已定义

C# EntityContainer名称必须是唯一的。名为';实体';已定义,c#,.net,visual-studio,entity-framework,exception-handling,C#,.net,Visual Studio,Entity Framework,Exception Handling,有一点背景: 我有一个具有以下结构的DLL项目: Rivworks.Model (project) \Negotiation (folder) Model.edmx (model from DB #1) \NegotiationAutos (folder) Model.edmx (model from DB #2) 我已将连接字符串从该项目的app.config移动到web.config文件。它们在ConnectionString部分中是而不

有一点背景:

我有一个具有以下结构的DLL项目:

Rivworks.Model (project)  
  \Negotiation (folder)  
      Model.edmx (model from DB #1)  
  \NegotiationAutos (folder)  
      Model.edmx (model from DB #2)  
我已将连接字符串从该项目的app.config移动到web.config文件。它们在ConnectionString部分中是而不是。相反,我有一个静态类,它使用web.config的一部分,并将它们作为AppSettings公开给我的应用程序。[settingName]

<FeedAutosEntities_connString>metadata=res://*/;provider=System.Data.SqlClient;provider connection string='Data Source=db4;Initial Catalog=RivFeeds;Persist Security Info=True;User ID=****;Password=&quot;****&quot;;MultipleActiveResultSets=True'</FeedAutosEntities_connString>
<RivWorkEntities_connString>metadata=res://*/NegotiationAutos.NegotiationAutos.csdl|res://*/NegotiationAutos.NegotiationAutos.ssdl|res://*/NegotiationAutos.NegotiationAutos.msl;provider=System.Data.SqlClient;provider connection string='Data Source=db2;Initial Catalog=RivFramework_Dev;Persist Security Info=True;User ID=****;Password=&quot;****&quot;;MultipleActiveResultSets=True'</RivWorkEntities_connString>
您将注意到元数据正在被重写为短版本

当我在每个类中注释掉该行时,我得到以下错误:

无法加载指定的元数据资源

当我在每个类中保留该行时,会出现以下错误:

指定的架构无效。错误:

Negotiation.Model.csdl(3,4):错误0019:EntityContainer名称必须唯一。已定义名为“Entities”的EntityContainer


我知道这很简单,很明显。欢迎任何建议…

您的两个EDMX文件可能具有相同的实体容器名称。你需要(至少)改变其中一个


在GUI设计器中,打开模型浏览器。查找显示“EntityContainer:Entities”的节点。点击它。在属性中,将
Name
更改为其他内容。保存并重新生成。

劫持它,因为它是谷歌搜索错误消息的最高结果


如果其他人在仅使用单个模型/上下文时遇到此问题:我曾经遇到过此问题,因为包含模型/上下文的程序集已重命名,并且应用程序的bin目录中保留了一个以前名称的副本。解决方案是删除旧的程序集文件。

我找到了一种方法,可以用相同的名称保存多个容器(当然是名称空间)

在EF5和VS2012中,可以设置三个不同的名称空间。首先,您可以在解决方案浏览器中单击edmx文件,并在“属性”窗口中设置“自定义工具名称空间”,您可以单击edmx正下方的*.Context.tt文件并在其中设置另一个名称空间,最后多亏了Stuntz先生令人敬畏的回答,我意识到通过打开edmx文件并在空白处单击,可以在properties窗口中的Schema下获得另一个名称空间字段

我想我们已经完成了,还没有完全完成,我知道您可以看到Entity Container Name字段,并将尝试在那里更改名称,但这似乎不起作用,您会遇到一个弹出的小错误。确保所有edmx文件都有一个单独的名称空间。(我确保在这三个地方都有一个唯一的名称空间)

然后转到模型浏览器,右键单击EntityContainer:Entity以转到属性并更改容器的名称。在那个到处都设置了名称空间的窗口中,我可以得到多个同名的上下文。我正在处理blahcontext和blahcontextcontainer之类的东西,尽管它们在不同的文件夹中


当您看到这是一个名称空间问题时。或者没有。

我也有这个问题,但我的解决方案是清理bin目录,然后删除带有实体容器名称的连接字符串。然后我可以重命名我的实体并放回连接字符串。

我重命名了我的项目,但旧文件仍在bin文件夹中。我刚刚不得不从bin文件夹中删除旧的DLL。

我刚刚遇到了这个问题。从实体框架认为需要添加哪些表的角度来看,它似乎进入了一个糟糕的状态

通常,EF不会识别必须创建一个新表,直到您放置该行

public virtual DbSet<NewTable> NewTable { get; set; }
公共虚拟数据库集新表{get;set;}
在上下文类中

然而,EF不知何故进入了一个糟糕的状态,在我的解决方案中仅仅存在NewTable类就触发了它认为需要生成那个表。因此,当上下文中的上述行触发它创建一个新的表时,它已经认为已经完成了,因此出现了关于重复实体的错误


我只是从我的解决方案中删除了NewTable类,注释掉了一些内容,这样它就可以再次编译(谢天谢地,没有太多这样的内容),然后添加了一个新的迁移,以确保它是空白的,因为它应该是空白的。然后,一旦事情恢复到更可预测的状态,我将NewTable类重新添加到解决方案中,添加迁移工作正常。

我的asp.net网站也遇到了同样的问题,为了解决这个问题,我特意在应用程序代码中的一个cs文件中添加了编译时错误,删除了分号,然后我通过再次添加分号纠正了编译问题


此过程导致应用程序再次编译。此错误消失后。

此问题的另一个原因是,在任何解决方案项目中添加模型并更改模型项目

--PROJECT A --> MODEL.EDMX

--- WEB CONFIG -->Entity Connection

--PROJECT B

--- WEB CONFIG -->Entity Connection
后来,我觉得这个结构不好,改变了项目

--PROJECT A
using PROJECT.C;
WEB.CONFIG - USE PROJECT C APP.CONFIG CONNECTIONSTRING 

--PROJECT B
using PROJECT.C;
WEB.CONFIG - USE PROJECT C APP.CONFIG CONNECTIONSTRING 

--PROJECT C  (CLASS LIBRARY) --> MODEL.EDMX 
--- APP.CONFIG -->Entity Connection
一切都很好,但我犯了一个错误。 错误详细信息:EntityContainer名称必须唯一。已定义名为“Entities”的EntityContainer

因为我忘了更改Web.Config文件

旧WEB.CONFIG

    <add name="donatelloEntities" connectionString="metadata=res://*;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=donatello;persist security info=True;user id=1;password=1;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
 <add name="donatelloEntities" connectionString="metadata=res://*/EntityModel.Model.csdl|res://*/EntityModel.Model.ssdl|res://*/EntityModel.Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=donatello;user id=sa;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

新建WEB.CONFIG

    <add name="donatelloEntities" connectionString="metadata=res://*;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=donatello;persist security info=True;user id=1;password=1;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
 <add name="donatelloEntities" connectionString="metadata=res://*/EntityModel.Model.csdl|res://*/EntityModel.Model.ssdl|res://*/EntityModel.Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=donatello;user id=sa;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

此问题很简单,但可能会导致时间损失。我想举个例子。我希望这是有用的


谢谢。

在我的例子中,问题是由于Web.config中的连接字符串与entities容器类的名称相同而引起的

改变

<add name="ConflictingNameEntities" connectionString="metadata=res://*/blahblah

解决实体6.2.0与2017年单一edmx的问题


我将model.edmx的名称更改为另一个名称,构建了项目,然后将其更改回原始名称。

在我的情况下,可能是在重新合并版本后,我的启动项目文件(csproj)损坏了

所有添加的实体类:

<Compile Include="Class.cs">
  <DependentUpon>MyModel.tt</DependentUpon>
</Compile>

MyModel.tt
移除后