实体框架错误 - “EntityContainer名称必须是唯一的”

时间:2009-06-11 06:40:40

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

我们有一个由两个项目组成的解决方案 - 控制台应用程序项目和Web应用程序项目。其中每个都具有相同的模式,但用于访问同一数据库的名称不同的.edmx文件。

控制台应用程序在托管Web应用程序的同一服务器上作为计划任务运行。 Web应用程序包含对控制台应用程序的引用,因为Web应用程序中的某些操作会导致调用控制台应用程序中的方法。 这种组合已在我们的暂存环境中成功运行了好几个月。

现场发布时,我们每天至少会看到以下错误消息:

指定的架构无效。错误:

  

ProjectName.csdl(3,4):错误0019:EntityContainer名称必须是   独特。名为“ProjectEntities”的EntityContainer已经存在   定义。 ProjectName.csdl(63,4):错误0019:a中的每个类型名称   架构必须是唯一的。类型名称'ProjectModel.DataSource'已经存在   定义。 ProjectName.csdl(75,4):错误0019:a中的每个类型名称   架构必须是唯一的。类型名称'ProjectModel.Error'已经存在   定义

这将继续,列出我们架构中的所有类型名称。

可以通过回收应用程序池或重新启动IIS来修复此错误。

请注意,在Web应用程序运行一段时间后才会出现错误 - 在编译或第一次访问应用程序时没有出现错误。

我的初步理论是两个实体容器之间存在冲突,因为Web应用程序引用了控制台应用程序,但是它们具有不同的名称,这使得错误“EntityContainer名称必须是唯一的。具有名称的EntityContainer” ProjectEntities已被定义为“令人困惑。

11 个答案:

答案 0 :(得分:24)

转到该bin文件夹并手动删除dll和pdb文件。

答案 1 :(得分:15)

在过去遇到这个问题时,我总是创建一个包含实体模型的第三个共享库 - 如果你决定添加一个新的表/那么你就知道不会出现名称冲突模型的列/方法,你只需要这样做一次等等。

答案 2 :(得分:7)

从此

更改Web配置文件实体连接字符串条目
metadata=res://*/App_Code.AAA.csdl|res://*/App_Code.AAA.ssdl|res://*/App_Code.AAA.msl;provider=System.Data.SqlClient;provider connection string="data source=XXX;initial catalog=XXX;user id=XXX;password=XXX;multipleactiveresultsets=True;App=EntityFramework"" 
providerName="System.Data.EntityClient

metadata=res://MyProject/App_Code.AAA.csdl|res://MyProject/App_Code.AAA.ssdl|res://MyProject/App_Code.AAA.msl;provider=System.Data.SqlClient;provider connection string="data source=XXX;initial catalog=XXX;user id=XXX;password=XXX;multipleactiveresultsets=True;App=EntityFramework"" 
providerName="System.Data.EntityClient

答案 3 :(得分:3)

以防万一其他人绝望而且没有找到任何答案 - 我意外地在第二个位置找到了包含在项目中的.edmx文件的副本。两者都被包含在构建中。

- )

如果发生这种情况,请不要担心:你不是第一个。

答案 4 :(得分:2)

如果在单个DLL或类库项目中有多个实体model.edmx文件,则会发生此错误。虽然我不知道错误背后的原因,但您可以通过删除其他模型或将其他model.edmx文件移动到另一个类库来解决此问题。

也不要忘记删除前一个dll的引用

答案 5 :(得分:2)

嗯,在我的情况下,我正在使用不同的软件架构,因为我有不同的项目(dll),他们访问同一个数据库,但我内部有不同的实体。所以,当我在项目中有需要全部或至少两个的引用时,我会收到此错误

如果我更改每个实体容器名称,我解决了问题,但现在我的连接字符串不同了,我必须在配置文件中包含我引用的每个dll的所有连接字符串。

答案 6 :(得分:0)

注意尝试将实体容器重命名为先前删除的实体容器时,您需要进入web.config或app.config并从配置部分中删除连接字符串。

答案 7 :(得分:0)

我通过。

修复了EntityFramework 6.0中的这个问题
  1. 在创建模型期间,我将.edmx命名为实体的名称。即(MYDbEntities)

  2. 创建后,打开MYDbEntities.Context.cs并修改"实体"分到" MYDbEntities"。

  3. 打开App.Config并查找连接字符串
  4. 打开MYDbEntities.Context.cs并将连接字符串从配置更改为连接字符串。例子" MyDbConnection"
  5. 确保连接字符串是这样的

    metadata = res:// /MYDbEntities.csdl|res:// /MYDbEntities.ssdl |res://*/MYDbEntities.msl;provider=System.Data.SqlClient;provider connection string =" data source =。; initial catalog = YourDb; persist security info = True; user id = sa; password = Sw0rdf!sh; multipleactiveresultsets = True; application name = EntityFramework"

  6. 注意:我的实体驻留在一个单独的DLL中。

    希望这有帮助。

答案 8 :(得分:0)

就我而言,所有解​​决方案均无效。最后,我在主机上回收了IIS,以使其正常运行。 希望这对某人有帮助:)

答案 9 :(得分:0)

我的实体在另一个类库(MyLibrary.Data)中。进行以下更改有效:

<add name="Entities" connectionString="metadata=res://*/;&#xA;         provider=MySql.Data.MySqlClient; .....

<add name="Entities" connectionString="metadata=res://MyLibrary.Data;&#xA;         provider=MySql.Data.MySqlClient;

答案 10 :(得分:-1)

就我而言,在尝试了此处给出的所有解决方案后,我只是在注释中添加了一个连接字符串并重新启动了 VS 2019,然后我就可以修改名称了。