EntityContainer名称在不同的程序集中必须是唯一的?

时间:2011-02-04 14:01:34

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

我有两个项目:

  • News.Data
  • Tags.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

3 个答案:

答案 0 :(得分:4)

<击> Connectionstrings在应用程序级别配置,容器名称用作唯一标识符。要么将containerNames更改为唯一值,要么重新实现ObjectContext的默认构造函数,可能会查找Setting,这可以在程序集级别进行配置。

编辑: 在此示例中创建ObjectContextNews.Data.Entities的实例时,上下文的基类通常使用ContainerName构造。此参数为ObjectContext提供了进行商店连接所需的所有信息,并完成了所有映射业务。

基本上,ObjectContext类型与ContainerName之间存在关联。在实例化第二个上下文Tags.Data.Entities时,它是一个不同的类型,它会尝试将类型与容器相关联,这就是抛出异常的原因,因为你不能将同一个ContainerName关联两次。

要解决这个问题,如果可以,最好的方法是使用不同的容器名称重新创建EDMX。如果删除不是一个选项,您可以修改设计器中的ContainerName参数,然后在记事本中打开edmx,并查找“EntitiesModelStoreContainer”,并将“实体”部分更改为新的ContainerName。

希望它有所帮助...

答案 1 :(得分:0)

我认为你已经尝试过这个:

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

答案 2 :(得分:0)

问题可能与您的逻辑无关。我有时在构建配置文件之间切换时会遇到这种情况要修复它,我删除所有临时文件并执行干净的构建。