【问题标题】:The EntityContainer name must be unique in different assemblies?EntityContainer 名称在不同的程序集中必须是唯一的吗?
【发布时间】:2011-02-04 14:01:33
【问题描述】:

我有两个项目:

  • News.Data
  • 标签.数据

两者都定义Entities。当我尝试执行时

using (var db = new News.Data.Entities("name=Entities"))
{
    results1 = db.News.ToList();
}

using (var db = new Tag.Data.Entities("name=Entities"))
{
    results2 = db.Tag.ToList();
}

在控制台应用程序上出现此错误:

指定的架构无效。错误: Model1.csdl(3,4):错误 0019: EntityContainer 名称必须是唯一的。 一个名称为 EntityContainer “实体”已定义。

可以用吗

News.Data.Entities
Tags.Data.Entities

而不是

News.Data.NewsEntities
Tags.Data.TagsEntities

?

【问题讨论】:

    标签: c# entity-framework entity-framework-4


    【解决方案1】:

    连接字符串在应用程序级别配置,并且容器名称用作唯一标识符。要么将 containerNames 更改为唯一值,要么重新实现 ObjectContext 的默认构造函数以查找 Setting,它可以在程序集级别进行配置。

    编辑: 在此示例中创建ObjectContextNews.Data.Entities 的实例时,上下文的基类通常使用ContainerName 构造。这个参数为ObjectContext 提供了所有必要的信息来建立它的存储连接,并完成它的所有映射业务。

    基本上,ObjectContext 类型和ContainerName 之间建立了关联。在实例化您的第二个上下文 Tags.Data.Entities(它是一种不同的类型)时,它会尝试将类型与容器相关联,这就是引发异常的原因,因为您不能将同一个 ContainerName 关联两次。

    要解决这个问题,如果可以的话,最好的办法是使用不同的容器名称重新创建 EDMX。如果不能删除,可以在设计器中修改ContainerName参数,然后在记事本中破解edmx,查找“EntitiesModelStoreContainer”,将“Entities”部分更改为新的ContainerName。

    希望对你有帮助...

    【讨论】:

    • 连接不是问题,类名是。
    • 我知道,但容器在应用程序级别也必须是唯一的。您有两个具有相同ContainerName 的容器。它在配置中给您带来冲突的事实应该是您的第一条线索。基本上,EF 将 ObjectContext 实例与您通过其构造函数提供唯一标识符(=容器名称)的 EDMX 相关联。
    • 上述答案中最有帮助的部分是有关直接在记事本中打开 EDMX 的详细信息。 Visual Studio 无法通过仅更改 VS 属性窗格中的容器名称来正确更新 EDMX。以前对类似问题的回答未能指出这一细节。
    • 在记事本中破解打开edmx,更改名称,然后刷新为我工作的edmx中的模型
    【解决方案2】:

    我认为你已经尝试过了:

    using (var db = new News.Data.Entities("name=NewsEntities"))
    {
        results1 = db.News.ToList();
    }
    
    using (var db = new Tag.Data.Entities("name=TagEntities"))
    {
        results2 = db.Tag.ToList();
    }
    

    您的问题是这两个项目具有相同的实体容器名称。您需要更改(至少)其中一个。

    编辑:对不起,回答你的确切问题......不!

    可以用吗

    News.Data.Entities
    Tags.Data.Entities
    

    而不是

    News.Data.NewsEntities
    Tags.Data.TagsEntities
    

    【讨论】:

    • 我使用的是相同的connectionstring<add name="Entities" connectionString="metadata=res://*/;provider=...
    • 啊,我明白了……构造函数的 name= 部分是要使用的连接字符串。
    • 好的,正如我所说,您确实需要有不同的实体容器名称。按照您的建议将它们重命名为 NewsEntites 和 TagEntities。
    【解决方案3】:

    问题可能不在于您的逻辑。当我在构建配置文件之间切换时,有时会遇到这种情况。为了修复它,我删除了所有临时文件并进行了干净的构建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 2012-05-12
      • 2011-07-27
      • 1970-01-01
      • 2016-05-01
      相关资源
      最近更新 更多