Количество элементов в концептуальном типе не совпадает с количеством элементов в типе объекта - PullRequest
22 голосов
/ 19 января 2010

Я использую .net Framework 3.5 SP1.

После добавления столбца в одну таблицу на Sql Server (а также изменения существующего столбца с разрешения пустых значений на NULL) я больше не могу запускать свой проект без этой ошибки:

Количество членов в концептуальный тип «XBRLDimensionalModel.axis_t» не совпадать с количеством членов на тип стороны объекта 'EOL.Xbrl.Persistence.Data.axis_t. Убедитесь, что количество членов то же самое.

Я отказался от попыток найти и исправить сгенерированный код. Теперь я удалил все свои локальные файлы, связанные с сущностями, и заново сгенерировал их, начав с нуля и добавив новый элемент (ADO.NET Entity Data Model). Я все еще получаю эту ошибку.

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

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

Я изменил свойство в моей модели edmx: «Обработка артефактов метаданных» на «Копировать в выходной каталог». Кажется, что файлы Designer.cs, csdl, msl, ssdl соответствуют последним изменениям БД.

Исключение выдается при первом обращении к моему экземпляру entityModel. Так что это до любой загрузки или сохранения данных из измененной таблицы.

есть идеи, где я иду не так? Спасибо, TG

Ответы [ 9 ]

33 голосов
/ 27 декабря 2011

Эта ошибка также может произойти, если файл EDMX был изменен за пределами Visual Studio.Щелкните правой кнопкой мыши файл EDMX и выберите «Запустить пользовательский инструмент»

8 голосов
/ 19 января 2010

Откройте вашу модель как XML.Удалите все ссылки на этот тип из CSDL.Сохраните и закройте, затем снова откройте в графическом интерфейсе.Теперь вы сможете обновлять модель как обычно.Если это не сработает, сделайте то же самое, но удалите и из MSL.

1 голос
/ 22 января 2013

Я столкнулся с той же проблемой, когда добавил один столбец в базу данных и добавил соответствующее свойство в сущность (edmx). Я также использовал систему контроля версий для своего решения. Как я заметил, сохраняя изменения в любом файле, сохраните действия с опцией перезаписи. Итак, я перезаписал файл конфигурации designer.cs, и проблема была решена.

С уважением, Бхушан

1 голос
/ 13 апреля 2010

При изменении внешнего ключа с nullable на non-nullable (или наоборот) обязательно измените кратность ассоциации с 0..1 на 1 (или наоборот). Дизайнер иногда пропускает это в обновлении из базы данных.

1 голос
/ 20 января 2010

Это кажется немного многословным для комментария, поэтому я добавляю это как другой ответ:

В ответ на предложение Крэйга я открыл файл edmx в средстве просмотра XML и удалил все ссылки на Axis_t (включая ассоциации из-за внешних ключей). Из всего файла.

Затем я «обновил» модель, открыв файл edmx в качестве интерфейса GUI, щелкнув правой кнопкой мыши | обновить из базы данных | Добавить (вкладка), которая теперь содержит только таблицу Axis_t Я добавил таблицу, которая, казалось, работала нормально, и включил мой новый столбец, и столбец был сопоставлен правильно.

Затем я запустил проект с тем же результатом. Та же ошибка, что и выше.

Теперь я вернулся к тому, что было в управлении исходным кодом, а также изменил столбцы базы данных (новый и измененный) как обнуляемые. Проект работает нормально. Я до сих пор не смог успешно реализовать новый столбец БД в EF. Он ведет себя так, как будто существует какая-то сохраненная / скомпилированная версия модели, которая не обновляется в процессе обновления.

0 голосов
/ 21 августа 2012

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

Теперь, когда я понял это, это очевидно, но у меня был напряженный час или два!

0 голосов
/ 04 августа 2012
  • Щелкните правой кнопкой мыши файл edmx и откройте с помощью XML .
  • Найдите неправильные типы данных и измените их.
  • Сохранить файл.

Это сработало для меня.

0 голосов
/ 30 июля 2012

У меня была такая же проблема часами.Обнаружил, что в моем файле Designer.cs одно из свойств моей сущности отсутствует его атрибуты.(Не знаете, как это произошло?)

 [EdmScalarPropertyAttribute(EntityKeyProperty = false, IsNullable = false)]
 [DataMemberAttribute()]
 public global::System.Int32 ContractCapacity

Теперь сообщение об ошибке имеет смысл, это отсутствующий DataMember.Как только атрибут был добавлен, ЭТО РАБОТАЛО !!!

0 голосов
/ 08 марта 2012

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

Похоже, что Visual Studio не "чистит" временную папку obj должным образом, и некоторые фрагменты старой модели все еще там.

Если я просто удаляю все файлы из папки "obj" и перекомпилирую, эта ошибка исчезает.

Модель в каждой версии идеальна, что сводило меня с ума.

Не сказать, что это ответ на вопрос ОП, но это определенно еще одна причина этой ошибки.

Steve

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