Подтвердить что ты не робот

Имя 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=&quot;****&quot;;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=&quot;****&quot;;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" уже определен.

Я знаю, что это что-то простое, что-то очевидное. Любые предложения приветствуются...

4b9b3361

Ответ 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=&quot;data source=.;initial catalog=donatello;persist security info=True;user id=1;password=1;multipleactiveresultsets=True;App=EntityFramework&quot;" 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=&quot;data source=.;initial catalog=donatello;user id=sa;multipleactiveresultsets=True;App=EntityFramework&quot;" 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 и не дал мне проблем.