Имя EntityContainer должно быть уникальным. EntityContainer с именем 'Entities' уже определен - PullRequest
38 голосов
/ 14 января 2010

Для небольшого фона:

У меня есть проект 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.

<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;
        }
    }
}

Вы заметите, что метаданные переписываются в короткую версию.

Когда я закомментирую эту строку в каждом классе, я получаю эту ошибку:

Невозможно загрузить указанный ресурс метаданных.

Когда я оставляю эту строку в каждом классе, я получаю эту ошибку:

Указанная схема недействительна. Ошибки:

Negotiation.Model.csdl (3,4): ошибка 0019: имя EntityContainer должно быть уникальным. EntityContainer с именем 'Entities' уже определен.

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

Ответы [ 12 ]

147 голосов
/ 13 июня 2012

Угон этого, так как это лучший результат Google для сообщения об ошибке.

На случай, если кто-то еще столкнется с этим, используя только одну модель / контекст: я однажды столкнулся с этой проблемой, поскольку сборка, содержащая модель / контекст, была переименована, а копия с предыдущим именем осталась в каталоге binприложение.Решением было удалить старый файл сборки.

46 голосов
/ 14 января 2010

Ваши два файла EDMX, вероятно, имеют одно и то же имя контейнера сущностей. Вам необходимо изменить (по крайней мере) один из них.

В конструкторе графического интерфейса откройте Браузер моделей. Найдите узел с надписью «EntityContainer: Entities». Нажмите на это. В Свойствах измените Name на что-то другое. Сохраните и восстановите.

12 голосов
/ 29 сентября 2014

У меня тоже была проблема, но я решил очистить каталог bin, а затем удалить строку подключения с именем контейнера сущностей. Тогда я мог бы переименовать мои сущности и вернуть строку подключения.

4 голосов
/ 21 ноября 2014

Я переименовал свой проект, но старый файл все еще находился в папке bin. Мне просто нужно было удалить старую DLL из папки bin.

3 голосов
/ 11 мая 2016

В моем случае проблема была вызвана тем, что моя строка подключения в Web.config была названа так же, как и мой контейнерный класс сущностей.

Изменение

<add name="ConflictingNameEntities" connectionString="metadata=res://*/blahblah

до

<add name="ConflictingNameEntitiesConnection" connectionString="metadata=res://*/blahblah

и заново создайте класс контейнера, щелкнув правой кнопкой мыши ConflictingNameModel.Context.tt в обозревателе решений и выбрав «Запустить пользовательский инструмент».

3 голосов
/ 14 мая 2013

Я нашел способ сохранить несколько контейнеров с одинаковыми именами (конечно же, с пространством имен).

В EF5 и VS2012 вы можете установить три разных пространства имен. Сначала вы можете щелкнуть файл edmx в браузере решения и в окнах свойств вы можете установить «Пространство имен пользовательских инструментов», вы можете щелкнуть файл * .Context.tt прямо под edmx и установить другое пространство имен, и, наконец, благодаря выводу от господина Штунца, отличный ответ, я понял, что, открыв файл edmx и щелкнув пробел, вы получите еще одно поле пространства имен в разделе Схема в окне свойств.

Думаю, что мы закончили, не совсем, я знаю, что вы видите поле Entity Container Name и попробуете изменить имя там, но это, похоже, не работает, вы получите маленькую ошибку, которая появляется. Убедитесь, что все ваши файлы edmx имеют отдельное пространство имен. (Я гарантировал, что у меня было уникальное пространство имен во всех трех местах)

Затем перейдите в браузер моделей и щелкните правой кнопкой мыши EntityContainer: Entity, чтобы перейти к свойствам и изменить имя вашего контейнера (ов). Из этого окна, где пространство имен установлено везде, я смог получить несколько контекстов с одним и тем же именем. Я внезапно имел дело с такими вещами, как blahcontext и blahcontextcontainer, даже если они были в разных папках.

Когда вы видите, что это проблема пространства имен. Или его отсутствие.

1 голос
/ 04 сентября 2017

Если вы используете веб-развертывание из Visual Studio, иногда не удаляет старые библиотеки DLL. У меня была та же проблема, я перешел на пакет веб-развертывания и не доставил мне проблем.

1 голос
/ 06 марта 2015

Я только что столкнулся с этим. Похоже, что Entity Framework попал в плохое состояние с точки зрения того, какие таблицы, по его мнению, нужно было добавить.

Обычно EF не распознает необходимость создания новой таблицы, пока вы не введете строку

public virtual DbSet<NewTable> NewTable { get; set; }

внутри вашего контекстного класса.

Однако EF каким-то образом попал в плохое состояние, когда простое присутствие класса NewTable в моем решении заставляло его думать, что ему нужно сгенерировать эту таблицу. Таким образом, к тому моменту, когда вышеприведенная строка в контексте активировала ее для создания таблицы NewTable, она уже думала, что это сделала, поэтому возникла ошибка в отношении дублированных сущностей.

Я просто удалил класс NewTable из своего решения, прокомментировал все, чтобы он снова скомпилировался (к счастью, этого было не так уж много), а затем добавил новую миграцию, чтобы убедиться, что она пуста, как и должна была быть. Затем, когда все вернулось в более предсказуемое состояние, я снова добавил класс NewTable в решение, и добавление миграции прошло нормально.

0 голосов
/ 24 августа 2017

В моем случае, возможно, после слияния версии файл моего проекта запуска (csproj) был поврежден.

Все классы сущностей, где добавлено:

<Compile Include="Class.cs">
  <DependentUpon>MyModel.tt</DependentUpon>
</Compile>

После удаления всех соответствующих записей вручную проблема была решена.

0 голосов
/ 09 июня 2017

Для решения проблемы Entity 6.2.0, VS 2017, single edmx

Я изменил имя моего model.edmx на другое имя, собрал проект, а затем вернул его к исходному имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...