【问题标题】:The EntityContainer name must be unique. An EntityContainer with the name 'Entities' is already definedEntityContainer 名称必须是唯一的。已定义名称为“实体”的 EntityContainer
【发布时间】:2010-01-13 21:08:26
【问题描述】:

了解一点背景:

我有一个具有以下结构的 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>

我有 2 个类,每个 Context 一个,它们看起来像这样:

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;
        }
    }
}

您会注意到元数据正在被重写为一个简短的版本。

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

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

当我在每个班级中留下该行时,我会收到此错误:

指定的架构无效。错误:

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

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

【问题讨论】:

    标签: c# .net visual-studio entity-framework exception-handling


    【解决方案1】:

    劫持这个,因为它是错误消息的最高 Google 结果。

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

    【讨论】:

    • 我在重命名程序集后遇到了完全相同的问题。您需要从 bin 文件夹中手动删除旧文件,因为 Visual Studio 不再跟踪它们并且执行“清理”不会删除它们
    • 太好了,非常感谢。我有不同版本的相同程序集,一个在 Web 服务 (4.0.1.0) 的 bin 中,另一个在 GAC (4.0.1.2) 中。在配置文件中,我定义了两个使用 GAC 版本(自定义角色提供程序)。在从 bin 文件夹中删除旧版本 dll 之前,我遇到了同样的错误。
    • 只是为了澄清一下,旧程序集位于部署位置的服务器端。
    • Jip,几个月后回到这里,看到了我最初的支持。希望我能再次投票
    • “执行清洁不会删除它们”怎么强调都不过分。
    【解决方案2】:

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

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

    【讨论】:

    • 是的 - 就这么简单。 (仍在尝试在(通常是隐藏的)类级别了解 EF 的整体模型。)
    • 您可能还需要在记事本中打开 EDMX 文件,因为当您在属性窗格中更改容器名称时,Visual Studio 可能无法正确获取更改。
    • 在我的例子中,我删除并重新添加了一个 EDMX 文件。我必须通过模型浏览器 => 属性来重新建立容器名称。
    【解决方案3】:

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

    【讨论】:

    • +1 这就是我的解决方案。自行删除 bin 内容并不能解决问题;这个答案的连接字符串部分起到了作用。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

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

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

      当您看到这是一个命名空间问题时。或缺乏。

      【讨论】:

      • 我还必须更改Model.tt 文件并更改那里的命名空间。我不确定更改实际的 edmx 命名空间会改变什么...
      • 很奇怪,如果我没有在 edmx 上设置命名空间(左键单击 edmx,而不是左键单击空白区域),它将停止生成我一半的 POCO。如果我包含它,我会生成一个额外的(空的)Model.cs 类。如果我用左键单击空格too 来更改命名空间,除了Model.cs 类我什么也得不到。呸呸呸
      • Eejit me: 在同一个文件夹中,所以生成的第二个显然压扁了第一个...
      【解决方案6】:

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

      改变

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

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

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

      【讨论】:

      • 这有帮助,应该整合到 jpo 的答案中!
      【解决方案7】:

      我刚碰到这个。就它认为需要添加的表而言,Entity Framework 似乎以某种方式进入了糟糕的状态。

      通常 EF 不会识别必须创建新表,直到您输入该行

      public virtual DbSet<NewTable> NewTable { get; set; }
      

      在你的上下文类中。

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

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

      【讨论】:

        【解决方案8】:

        如果您使用 Visual Studio 中的 Web 部署,有时不会删除旧的 dll。我也遇到了同样的问题,改成 Web Deployment Package 也没问题。

        【讨论】:

        • 这可能发生在 VS2012 和 VS2017 中
        【解决方案9】:

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

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

        【讨论】:

          【解决方案10】:

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

          --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 名称必须是唯一的。已定义名为“实体”的 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" />
          

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

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

          谢谢。

          【讨论】:

            【解决方案11】:

            解决Entity 6.2.0, VS 2017, single edmx的问题

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

            【讨论】:

              【解决方案12】:

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

              所有添加的实体类:

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

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

              【讨论】:

                【解决方案13】:

                奇怪的问题有奇怪的答案,所以请不要责怪。

                首先,快速看一下这部分代码

                我遇到了问题

                The EntityContainer name must be unique. An EntityContainer with the name 'Entities' is already defined
                

                使用此类名称“ShippingSpeed_Month_Speed”

                对我来说,解决方案就是将“speeds”重命名为“speedsx”。

                因此,您可能需要重命名关系或导航属性的结尾名称,即相同表名的相同结尾或 DbSet 的结尾名称

                我正在回答以记录对我有用的方法并希望使他人受益。

                谢谢

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-05-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多