EntityContainer名称必须是唯一的。已定义名为“实体”的EntityContainer

时间:2010-01-13 21:08:26

标签: 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部分中。相反,我有一个静态类,它消耗部分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>

我有两个类,每个上下文一个,它们看起来像这样:

namespace RivWorks.Model
{
    public class RivWorksStore
    {
        private RivWorks.Model.Negotiation.Entities _dbNegotiation;

        public RivWorksStore(string connectionString, string metadata, string provider)
        {
            EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
            entityBuilder.ConnectionString = connectionString;
            entityBuilder.Metadata = "res://*/";    // metadata;
            //entityBuilder.Provider = provider;
            _dbNegotiation = new RivWorks.Model.Negotiation.Entities(entityBuilder.ConnectionString);
        }

        public RivWorks.Model.Negotiation.Entities NegotiationEntities()
        {
            return _dbNegotiation;
        }
    }
}

namespace RivWorks.Model
{
    public class FeedStoreReadOnly
    {
        private RivWorks.Model.NegotiationAutos.Entities _dbFeed;

        public FeedStoreReadOnly(string connectionString, string metadata, string provider)
        {
            EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
            entityBuilder.ConnectionString = connectionString;
            entityBuilder.Metadata = "res://*/";    // metadata;
            //entityBuilder.Provider = provider;
            _dbFeed = new RivWorks.Model.NegotiationAutos.Entities(entityBuilder.ConnectionString);
        }

        public RivWorks.Model.NegotiationAutos.Entities ReadOnlyEntities()
        {
            return _dbFeed;
        }
    }
}

您会注意到MetaData正在被重写为简短版本。

当我在每个课程中注释掉该行时,我收到此错误:

  

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

当我在每个课程中留下该行时,我收到此错误:

  

指定的架构无效。错误:

     

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

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

12 个答案:

答案 0 :(得分:146)

劫持此问题,因为它是错误消息的Google搜索结果。

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

答案 1 :(得分:44)

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

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

答案 2 :(得分:12)

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

答案 3 :(得分:4)

我重命名了我的项目,但旧文件仍然在bin文件夹中。我只需要从bin文件夹中删除旧的DLL。

答案 4 :(得分:3)

我找到了一种方法来保存多个具有相同名称的容器(当然是命名空间)。

在EF5和VS2012中,您可以设置三个不同的命名空间。首先,您可以在解决方案浏览器中单击edmx文件,在属性窗口中可以设置“自定义工具命名空间”,您可以单击edmx正下方的* .Context.tt文件并在那里设置另一个命名空间,最后感谢Stuntz先生的精彩回答,我意识到通过打开edmx文件并单击空白区域,您可以在属性窗口中的Schema下获得另一个名称空间字段。

认为我们已经完成,不完全,我知道您可以看到实体容器名称字段,并将尝试更改其名称,但似乎不起作用,您会收到一个弹出的小错误。确保所有edmx文件都有一个单独的命名空间。 (我确保我在所有三个地方都有一个独特的命名空间)

然后转到模型浏览器并右键单击EntityContainer:Entity转到属性并更改容器的名称。从该窗口到命名空间设置到处,我能够获得具有相同名称的多个上下文。即使他们在不同的文件夹中,我也突然处理了像blahcontext和blahcontextcontainer这样的东西。

当你看到它的命名空间问题时。或缺乏。

答案 5 :(得分:3)

在我的情况下,问题是由我的Web.config中的连接字符串命名与我的实体容器类相同。

更改

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

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

并通过右键单击解决方案资源管理器中的ConflictingNameModel.Context.tt并单击&#34;运行自定义工具&#34;来重新生成容器类。

答案 6 :(得分:1)

我刚碰到这个。看起来Entity Framework在它认为需要添加的表格方面陷入了糟糕的状态。

通常情况下,在您放置

行之前,EF不会识别必须创建新表
public virtual DbSet<NewTable> NewTable { get; set; }

在你的上下文类中。

然而,EF在某种程度上陷入了糟糕的状态,在我的解决方案中仅仅存在NewTable类会触发它认为它需要生成该表。因此,当上下文中的上述行触发它创建一个NewTable表时,它已经认为它已经完成了它,因此出现了关于重复实体的错误。

我刚刚从我的解决方案中删除了NewTable类,对其进行了评论,以便再次编译(谢天谢地,这并没有太多),然后添加了一个新的迁移,以确保它本身是空白的。然后,当事情回到更可预测的状态时,我将NewTable类重新添加回解决方案并添加迁移工作正常。

答案 7 :(得分:1)

如果从Visual Studio使用Web部署,有时不会删除旧的dll。我遇到了同样的问题,更改为Web部署包并没有给我带来任何问题。

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

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

--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名称必须是唯一的。一个名为&#39; Entities&#39;的EntityContainer已定义

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

OLD 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" />

新WEB.CONFIG

 <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" />

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

感谢。

答案 10 :(得分:0)

解决问题实体6.2.0,VS 2017,单edmx

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

答案 11 :(得分:0)

就我而言,可能在合并版本后,我的启动项目文件(csproj)已损坏。

添加的实体类:

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

手动删除所有相关条目后,问题就解决了。