我们有一个由两个项目组成的解决方案 - 控制台应用程序项目和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已被定义为“令人困惑。
答案 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中的这个问题在创建模型期间,我将.edmx命名为实体的名称。即(MYDbEntities)
创建后,打开MYDbEntities.Context.cs并修改"实体"分到" MYDbEntities"。
确保连接字符串是这样的
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"
注意:我的实体驻留在一个单独的DLL中。
希望这有帮助。
答案 8 :(得分:0)
就我而言,所有解决方案均无效。最后,我在主机上回收了IIS,以使其正常运行。 希望这对某人有帮助:)
答案 9 :(得分:0)
我的实体在另一个类库(MyLibrary.Data)中。进行以下更改有效:
<add name="Entities" connectionString="metadata=res://*/;
 provider=MySql.Data.MySqlClient; .....
<add name="Entities" connectionString="metadata=res://MyLibrary.Data;
 provider=MySql.Data.MySqlClient;
答案 10 :(得分:-1)
就我而言,在尝试了此处给出的所有解决方案后,我只是在注释中添加了一个连接字符串并重新启动了 VS 2019,然后我就可以修改名称了。