Имя EntityContainer должно быть уникальным. EntityContainer с именем "Entities" уже определен
Для небольшого фона:
У меня есть проект 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>
У меня есть 2 класса, по одному для каждого Контекста, и они выглядят так:
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 с именем "Entities" уже определен.
Я знаю, что это что-то простое, что-то очевидное. Любые предложения приветствуются...
Ответы
Ответ 1
Два файла EDMX, вероятно, имеют одно и то же имя контейнера объектов. Вам нужно изменить (по крайней мере) один из них.
В дизайнере GUI откройте "Обозреватель моделей". Найдите node, который говорит "EntityContainer: Entities". Нажмите на нее. В свойствах измените Name
на другое. Сохраните и перестройте.
Ответ 2
Захват этого, так как он является лучшим результатом Google для сообщения об ошибке.
Если кто-то еще сталкивается с этим, только используя одну модель/контекст: однажды я столкнулся с этой проблемой, потому что сборка, содержащая модель/контекст, была переименована, а копия с предыдущим именем осталась в каталоге bin приложения. Решение состояло в том, чтобы удалить старый файл сборки.
Ответ 3
У меня тоже была проблема, но мое решение состояло в том, чтобы очистить каталог bin, а затем удалить строку подключения с именем контейнера сущности. Затем я мог бы переименовать мои объекты и вернуть строку соединения.
Ответ 4
Я переименовал свой проект, но старый файл все еще находился в папке bin. Мне просто пришлось удалить старую DLL из папки bin.
Ответ 5
Я нашел способ сохранить несколько контейнеров с тем же именем (имена, конечно, конечно).
В EF5 и VS2012 вы можете установить три разных пространства имен. Сначала вы можете щелкнуть по файлу edmx в браузере решений, а в окнах свойств вы можете установить "Пользовательское пространство имен инструментов", вы можете щелкнуть по файлу *.Context.tt прямо под edmx и установить там другое пространство имен и, наконец, благодаря лидерству г-на Stuntz, я понял, что, открыв файл edmx и щелкнув в белом пространстве, вы получите другое поле пространства имен в Schema в окне свойств.
Подумайте, мы закончили, не совсем, я знаю, что вы можете увидеть поле Entity Container Name и попытаться изменить имя там, но это, похоже, не работает, вы получаете небольшую ошибку, которая появляется. Убедитесь, что все ваши файлы edmx имеют отдельное пространство имен. (Я гарантировал, что у меня было уникальное пространство имен во всех трех местах)
Затем перейдите в свой браузер моделей и щелкните правой кнопкой мыши EntityContainer: Entity, чтобы перейти к свойствам и изменить имя вашего контейнера (ов). Из этого окна с пространством имен, установленным повсюду, я смог получить несколько контекстов с тем же именем. Внезапно я столкнулся с такими вещами, как blahcontext и blahcontextcontainer, хотя они были в разных папках.
Когда вы видите, что это проблема пространства имен. Или их отсутствие.
Ответ 6
В моем случае проблема была вызвана тем, что моя строка соединения в Web.config была названа той же самой, что и контейнерный класс моих объектов.
Изменить
<add name="ConflictingNameEntities" connectionString="metadata=res://*/blahblah
к
<add name="ConflictingNameEntitiesConnection" connectionString="metadata=res://*/blahblah
и восстановите класс контейнера, щелкнув правой кнопкой мыши ConflictingNameModel.Context.tt в Обозревателе решений и нажав "Запустить пользовательский инструмент".
Ответ 7
Я просто столкнулся с этим. Похоже, что Entity Framework попала в плохое состояние с точки зрения того, какие таблицы она должна была добавить.
Обычно EF не будет распознавать, что нужно создать новую таблицу, пока вы не поместите строку
public virtual DbSet<NewTable> NewTable { get; set; }
внутри вашего контекстного класса.
Однако EF каким-то образом попал в плохое состояние, когда простое присутствие класса NewTable в моем решении вызывало его мысль о необходимости создания этой таблицы. Таким образом, к тому времени, когда указанная выше строка в контексте вызвала ее для создания таблицы NewTable, она уже думала, что она это сделала, следовательно, ошибка о повторяющихся объектах.
Я просто удалил класс NewTable из своего решения, прокомментировал ситуацию, чтобы он снова скомпилировался (к счастью, этого было не так), а затем добавил новую миграцию, чтобы убедиться, что она пуста, как и должно было быть. Затем, как только все вернулось в более предсказуемое состояние, я снова добавил класс NewTable в решение и добавил, что миграция выполнена нормально.
Ответ 8
У меня была такая же проблема на моем веб-сайте asp.net, чтобы решить проблему, я намеренно добавил ошибку времени компиляции в один из файлов cs в коде приложения, удалив точку с запятой, затем я исправил проблему с компиляцией, добавив точку с запятой снова.
Этот процесс вызвал повторное компиляцию приложения. После этого ошибка исчезла.
Ответ 9
Другая причина этой проблемы - добавить модель в любой проект решения и изменить модельный проект.
--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 должно быть уникальным. EntityContainer с именем "Entities" уже определен
Потому что я забыл изменить файлы 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
Чтобы решить проблему Entity 6.2.0, VS 2017, single edmx
Я изменил имя моего model.edmx на другое имя, построил проект, а затем изменил его на исходное имя.
Ответ 11
В моем случае, возможно, после слияния версии, мой файл проекта запуска (csproj) получил повреждение.
Al классы Entity, где добавлено:
<Compile Include="Class.cs">
<DependentUpon>MyModel.tt</DependentUpon>
</Compile>
После удаления всех соответствующих записей вручную проблема была решена.
Ответ 12
Если вы используете веб-развертывание из Visual Studio, иногда не удаляет старые DLL. У меня была та же проблема, я перешел в пакет развертывания Web и не дал мне проблем.