Ошибка Entity Framework - "Имя EntityContainer должно быть уникальным"

У нас есть решение, состоящее из двух проектов - консольного приложения и проекта веб-приложения. Каждый из них имеет идентичный в схеме, но по-разному названный .edmx файл, используемый для доступа к той же базе данных.

Консольное приложение запускается как запланированное задание на том же сервере, на котором размещено веб-приложение. Веб-приложение содержит ссылку на консольное приложение, так как определенные действия в веб-приложении приводят к методам вызова вызываемого приложения. Эта комбинация успешно работает в нашей промежуточной среде в течение многих месяцев.

При выпуске в прямом эфире мы видим следующее сообщение об ошибке не реже одного раза в день:

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

ProjectName.csdl(3,4): ошибка 0019: имя EntityContainer должно быть уникальный. EntityContainer с именем "ProjectEntities" уже определены. ProjectName.csdl(63,4): ошибка 0019: имя каждого типа в схема должна быть уникальной. Имя типа 'ProjectModel.DataSource' уже было определены. ProjectName.csdl(75,4): ошибка 0019: имя каждого типа в схема должна быть уникальной. Имя типа 'ProjectModel.Error' уже было определены.

Это продолжается, перечисляя все имена типов в нашей схеме.

Эта ошибка может быть устранена путем утилизации пула приложений или перезапуска IIS.

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

Моя первоначальная теория заключалась в том, что два контейнера Entity Containers конфликтуют друг с другом, потому что веб-приложение ссылается на консольное приложение, но у них разные имена, что делает ошибку "Имя EntityContainer должно быть уникальным. EntityContainer с именем" ProjectEntities 'уже определен "запутанный".

Ответы

Ответ 1

Перейдите в папку bin и удалите файл dll и pdb вручную.

Ответ 2

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

Ответ 3

Измените запись строки подключения сущности файла webconfig из этого

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

Ответ 4

На всякий случай, если кто-то еще отчаялся и не нашел ответов, я случайно попал с копией моего .edmx файла, включенного в проект во втором месте. Оба были включены в сборку.

; -)

Если это случилось с вами, не бойтесь: вы не были первыми.

Ответ 5

Эта ошибка возникает, когда у вас есть несколько файлов model model.edmx в одном проекте библиотеки DLL или библиотеки классов. Хотя причина ошибки не известна мне, вы можете исправить это, удалив другую модель или переместив другой файл model.edmx в другую библиотеку классов.

Также не забудьте удалить ссылки предыдущей DLL

Ответ 6

Ну, в моем случае я работаю с другой архитектурой программного обеспечения, потому что у меня разные проекты (dll), они имеют доступ к одной и той же базе данных, но внутри меня есть разные сущности. Итак, когда у меня есть ссылки в проекте, который нуждается во всех или хотя бы двух из них, я получаю эту ошибку

Если я изменяю имя контейнера Entity на каждом из них, я решаю проблему, но теперь моя строка соединения различна, и я должен включить все строки подключения в файл конфигурации для каждой DLL, которую я имею в виду.

Ответ 7

Обратите внимание, что при попытке переименовать контейнер объекта в контейнер ранее удаленных сущностей вам нужно будет войти в свой файл web.config или app.config и удалить строку подключения из раздела конфигурации.

Ответ 8

Папка для меня была скрыта, поэтому пришлось показывать скрытые файлы, удалять старые dlls/pdb и включать в проект те, которые мне нужны. Восстановлено, работает.

Ответ 9

Я исправил эту проблему в EntityFramework 6.0.

  • Во время создания моделей я называю .edmx именем имени. то есть (MYDbEntities)

  • После создания я откройте MYDbEntities.Context.cs и изменил класс "Entities" на "MYDbEntities".

  • Откройте приложение App.Config и найдите строку подключения
  • Откройте MYDbEntities.Context.cs и измените строку подключения на строку Connection из конфигурации. пример "MyDbConnection"
  • Убедитесь, что строка подключения похожа на это

    metadata = res:///MYDbEntities.csdl | res:///MYDbEntities.ssdl | res://*/MYDbEntities.msl; поставщик = System.Data.SqlClient; строка подключения поставщика = "источник данных =., начальный каталог = YourDb; сохраняемая информация о безопасности = True; user id = sa; пароль = Sw0rdf! sh; multipleactiveresultsets = True; имя приложения = EntityFramework "

Примечание. Мои объекты находятся в отдельной DLL.

Надеюсь, что это поможет.

Ответ 10

В моем случае ни одно из решений не работало. Я, наконец, переработал IIS на своем хостинге, чтобы он работал. Надеюсь, это поможет кому-то :)

Ответ 11

Мои сущности были в другой библиотеке классов (MyLibrary.Data). Смена ниже сработала:

<add name="Entities" connectionString="metadata=res://*/;&#xA;         provider=MySql.Data.MySqlClient; .....

<add name="Entities" connectionString="metadata=res://MyLibrary.Data;&#xA;         provider=MySql.Data.MySqlClient;