2009-06-11 1 views
15

У нас есть решение, которое состоит из двух проектов - проекта консольного приложения и проекта веб-приложения. Каждый из них имеет идентичную схему, но по-разному называется .edmx-файлом, используемым для доступа к одной и той же базе данных.Ошибка Entity Framework - «Имя EntityContainer должно быть уникальным»

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

При отпускании жить мы видим следующее сообщение об ошибке, по крайней мере один раз в день:

Схема Указан недопустимый. Ошибки:

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» уже определен «запутанный.

+0

Проверьте эту ссылку [1]: http://stackoverflow.com/questions/4898794/the-entitycontainer-name-must-be-unique-in-different-assemblies, это работает для меня. Надеюсь, вам поможет! –

ответ

15

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

+0

Это подход, который мы предприняли для решения проблемы. – ENX

+0

@ENX возможно вы можете отметить это как ответ тогда. – icelava

+0

@icelava - @ ENX's не видел более полутора лет :(Вы всегда можете проголосовать за это, чтобы усилить ответ;) –

2

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

DonT Также забудьте удалить ссылки из предыдущего DLL

2

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

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

24

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

+4

Это сработало для меня. Я переименовал библиотеку классов, и старая dll все еще находилась в папке bin. – wmcainsh

+0

Это сработало и для меня! –

+0

Это тоже работало для меня, я удалил все старые dll в папке, которую я использую для публикации своего приложения. – ravithejag

0

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

3

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

;-)

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

0

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

5

Изменения 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 
+0

В моей ситуации это отлично работало: одно приложение использует две библиотеки (тип архитектуры плагина), которые включают ссылку «ILMerged» в ту же библиотеку моделей. Большое спасибо. –

0

Я установил этот вопрос в EntityFramework 6.0 на.

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

  2. После создания я открыл MYDbEntities.Context.cs и модифицировал класс «Сущности» в «MYDbEntities».

  3. Откройте App.Config и найдите строку подключения
  4. Откройте MYDbEntities.Context.cs и изменить строку подключения в строку подключения из конфига. Пример "MyDbConnection"
  5. Убедитесь, что строка соединения, как это

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

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

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