有一点背景:
我有一个具有以下结构的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="****";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="****";MultipleActiveResultSets=True'</RivWorkEntities_connString>
我有两个类,每个上下文一个,它们看起来像这样:
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;
}
}
}
您会注意到MetaData正在被重写为简短版本。
当我在每个课程中注释掉该行时,我收到此错误:
无法加载指定的元数据资源。
当我在每个课程中留下该行时,我收到此错误:
指定的架构无效。错误:
Negotiation.Model.csdl(3,4):错误0019:EntityContainer名称必须是唯一的。已定义名为“实体”的EntityContainer。
我知道这很简单,很明显。欢迎任何建议......
答案 0 :(得分:146)
劫持此问题,因为它是错误消息的Google搜索结果。
如果其他人在使用单个模型/上下文时遇到此问题:我曾遇到过这个问题,因为包含模型/上下文的程序集已重命名,并且具有先前名称的副本仍保留在应用程序的bin目录中。解决方案是删除旧的程序集文件。
答案 1 :(得分:44)
您的两个EDMX文件可能具有相同的实体容器名称。您需要更改(至少)其中一个。
在GUI设计器中,打开模型浏览器。查找名为“EntityContainer:Entities”的节点。点击它。在“属性”中,将Name
更改为其他内容。保存并重建。
答案 2 :(得分:12)
我也有问题,但我的解决方法是清理bin目录,然后删除带有实体容器名称的连接字符串。然后我可以重命名我的实体并放回连接字符串。
答案 3 :(得分:4)
我重命名了我的项目,但旧文件仍然在bin文件夹中。我只需要从bin文件夹中删除旧的DLL。
答案 4 :(得分:3)
我找到了一种方法来保存多个具有相同名称的容器(当然是命名空间)。
在EF5和VS2012中,您可以设置三个不同的命名空间。首先,您可以在解决方案浏览器中单击edmx文件,在属性窗口中可以设置“自定义工具命名空间”,您可以单击edmx正下方的* .Context.tt文件并在那里设置另一个命名空间,最后感谢Stuntz先生的精彩回答,我意识到通过打开edmx文件并单击空白区域,您可以在属性窗口中的Schema下获得另一个名称空间字段。
认为我们已经完成,不完全,我知道您可以看到实体容器名称字段,并将尝试更改其名称,但似乎不起作用,您会收到一个弹出的小错误。确保所有edmx文件都有一个单独的命名空间。 (我确保我在所有三个地方都有一个独特的命名空间)
然后转到模型浏览器并右键单击EntityContainer:Entity转到属性并更改容器的名称。从该窗口到命名空间设置到处,我能够获得具有相同名称的多个上下文。即使他们在不同的文件夹中,我也突然处理了像blahcontext和blahcontextcontainer这样的东西。
当你看到它的命名空间问题时。或缺乏。
答案 5 :(得分:3)
在我的情况下,问题是由我的Web.config中的连接字符串命名与我的实体容器类相同。
更改
<add name="ConflictingNameEntities" connectionString="metadata=res://*/blahblah
到
<add name="ConflictingNameEntitiesConnection" connectionString="metadata=res://*/blahblah
并通过右键单击解决方案资源管理器中的ConflictingNameModel.Context.tt并单击&#34;运行自定义工具&#34;来重新生成容器类。
答案 6 :(得分:1)
我刚碰到这个。看起来Entity Framework在它认为需要添加的表格方面陷入了糟糕的状态。
通常情况下,在您放置
行之前,EF不会识别必须创建新表public virtual DbSet<NewTable> NewTable { get; set; }
在你的上下文类中。
然而,EF在某种程度上陷入了糟糕的状态,在我的解决方案中仅仅存在NewTable类会触发它认为它需要生成该表。因此,当上下文中的上述行触发它创建一个NewTable表时,它已经认为它已经完成了它,因此出现了关于重复实体的错误。
我刚刚从我的解决方案中删除了NewTable类,对其进行了评论,以便再次编译(谢天谢地,这并没有太多),然后添加了一个新的迁移,以确保它本身是空白的。然后,当事情回到更可预测的状态时,我将NewTable类重新添加回解决方案并添加迁移工作正常。
答案 7 :(得分:1)
如果从Visual Studio使用Web部署,有时不会删除旧的dll。我遇到了同样的问题,更改为Web部署包并没有给我带来任何问题。
答案 8 :(得分:0)
我在我的asp.net网站遇到同样的问题,解决了我故意在应用程序代码中的一个cs文件中删除分号后添加编译时错误的问题,然后我通过再次添加分号来纠正编译问题
此过程导致应用程序再次编译。此错误消失后。
答案 9 :(得分:0)
此问题的另一个原因是,您在任何解决方案项目中添加模型并更改模型项目。
--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名称必须是唯一的。一个名为&#39; Entities&#39;的EntityContainer已定义
因为我忘了更改Web.Config文件。
OLD WEB.CONFIG
<add name="donatelloEntities" connectionString="metadata=res://*;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=donatello;persist security info=True;user id=1;password=1;multipleactiveresultsets=True;App=EntityFramework"" 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="data source=.;initial catalog=donatello;user id=sa;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
这个问题很简单但可能会导致时间浪费。我想举个例子。我希望是有用的。
感谢。
答案 10 :(得分:0)
解决问题实体6.2.0,VS 2017,单edmx
我将model.edmx的名称更改为其他名称,构建项目,然后将其更改回原始名称。
答案 11 :(得分:0)
就我而言,可能在合并版本后,我的启动项目文件(csproj)已损坏。
添加的实体类:
<Compile Include="Class.cs">
<DependentUpon>MyModel.tt</DependentUpon>
</Compile>
手动删除所有相关条目后,问题就解决了。