Информация о картировании и метаданных не может быть найдена для ошибки EntityType

StackOverflow https://stackoverflow.com/questions/2350514

Вопрос

Я столкнулся с исключением, когда использую Entity Framework 4.0 RC. Моя модель фреймворта моей организации инкапсулируется в частной сборке, которая зовут Docurement.efdataprovider, а мои классы Poco находятся внутри другой закупки сборки. Соотношение между Core (Business Logic) и Efdataprovider (Доступ к данным) с заводской по имени DataProvider

Поэтому, когда я пытаюсь создать объект

objectSet = ObjectContext.CreateObjectSet<TEntity>();

Я получаю ошибку:

Информация о картировании и метаданных не может быть найдена для EntityType 'закупок.core.entitiets.organizationCart'.

Это было полезно?

Решение

Для тех, кто занимается ошибкой, я думаю, что стоит упомянуть некоторые сценарии, которые я нашел, что приводит к этой (крайне бесполезной) ошибке:

  • Средства с ошибками (чувствительные к случаям!)
  • Свойства отсутствуют в классе Poco
  • Несоответствия типа между POCO и типом объекта (например, int вместо длинного)
  • Перечисление в Poco (EF не поддерживает перечисления прямо сейчас, насколько я понимаю)

Там могут быть и другие причины.

Hth

Другие советы

Вероятно, это потому, что EF не может найти встроенную информацию о картировании. Внутри вашей строки подключения у вас, вероятно, будет что -то вроде его:

metadata=res://*/Models.MyModels.csdl|...etc

Это * подстановочный знак, который сообщает объектному контексту, чтобы попытаться найти встроенное отображение информации из, я думаю, сканируя все загруженные сборки. Если сборка не загружена, EF не найдет ее.

Что вам нужно сделать, так это предоставить строку подключения дополнительной информации о том, где встроена информация о картировании. Измените * на конкретное имя сборки вашего кода отображения:

metadata=res://Procurement.EFDataProvider/Models.MyModels.csdl

Если это не удается, найдите сборку и напрямую загрузите ее в свой объект, используя:

ObjectContext.Metadataworkspace.LoadFromAssembly();

Не связано напрямую с вышеизложенным, но если вы получите это сообщение об ошибке, и вы смешали Poco и обычную модель: плохая идея!

Смотрите также комментарий Jroppert в EF4 POCO (не используя T4): Информация об отображении и метаданных не может быть найдена для EntityType (Спасибо, Jroppert!)

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

Вот что говорится об исключении в system.data.objects.objectcontext

// исключения:

    //   System.InvalidOperationException:
    //     When the System.Data.Metadata.Edm.EntitySet from entitySetName
    //     does not match the System.Data.Metadata.Edm.EntitySet of the object’s
    //     System.Data.EntityKey.
    // -or-
    //     When the System.Data.Objects.ObjectContext.DefaultContainerName
    //     property is not set on the System.Data.Objects.ObjectContext and 
    //     the name is not qualified as part of the entitySetName parameter.
    // -or-
    //     When the specified type belongs to more than one entity set.

Я также видел его, когда строка подключения не указана в файле конфигурации.

Другая возможная проблема - это, Если вы используете код первым И ваш тип сущности определяется в отдельной сборке туда, где определяется контекст, и вы не добавили никаких пользовательских сопоставлений в OnModelCreating(DbModelBuild modelBuilder) Метод, тогда EF, кажется, игнорирует аннотации данных.

Решение:

Добавлять modelBuilder.Entity<YourEntityType>(); в OnModelCreating(DbModelBuild modelBuilder) метод

Связанный пост.

Просто проверьте правописание свойства с помощью модели

Там может быть другая причина. Я также вытащил волосы на ночь.

Я оказался, что в справочнике есть некоторое расстройство. В моем проекте, edmx принадлежит проекту под названием DataAccess.Dll. Анкет Но у меня нет ссылки на это из моего EXE. Из моего EXE у меня есть ссылка на другой проект под названием Business.Dll, и этот проект имеет ссылку для и старое место для DataAccess.DLL.

Сделайте следующий тест, чтобы увидеть, есть ли у вас такая проблема:

  1. Откройте директора Bin вашего проекта EXE и оставьте его видимым.
  2. Построить решение.
  3. Первый проект, который будет построен, - это проект доступа к данным, и вы можете увидеть в папке Bin текущее время в качестве модифицированной даты.
  4. В то время как другие проекты построены, вы увидите, что измененная дата проекта DataCcess была изменена на старый.

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

В моем случае это была та же проблема, а картирование не было точно так, как ожидалось. Со мной случилось то, что я перевел собственность в «таблице за иерархию наследство» от одного из подклассов в базовый класс и забыл обновить модель.

У меня есть пользовательский Poco, и он копировал файл EDMX в чистый новый проект и позволил ему автогенерировать сущности, а затем сравнить их с тем, что я помог мне найти разницу.

Ошибка NOOB, но у меня была ошибка, когда мой доступ к БД был с чтением только имя пользователя и пароль. Надеюсь, что мои ошибки помогут другим.

У меня была похожая проблема. У меня уже был один файл EDMX для одной базы данных с использованием классов POCO и контекстного объекта, который я написал сам. Когда я добавил второй EDMX для другой базы данных, я использовал шаблон POCO T4, а затем ни один EDMX не работал и не бросил упомянутую вами ошибку. Чтобы решить его, я откинул свой собственный POCO и контекст, использовал только шаблон T4 и все снова работали.

У меня была проблема, когда я добавил несколько столбцов в таблицу.

В табличных сопоставлениях я переименовал имена столбцов.

Хотя я запустил «преобразовать все шаблоны» и перестроил приложение, я все еще получил «связанный тип метаданных для типа <>» содержит следующие неизвестные свойства или поля <>.

Класс для этой таблицы в Domain.poco.tt был правильным, но я нашел соответствующий файл class.metadata.cs в domain.poco.metadata.tt не обновлялся и имел новые столбцы с исходными именами - не новыми те, которые я указал в картировании таблицы.

Решение? Я только что удалил класс оскорбительных метаданных и повторно заработал «преобразование всех шаблонов», и он был воссоздан правильно, с правильными именами столбцов/функций.

Моя проблема заключалась в том, что я отредактировал шаблон T4, чтобы исключить поле репликации с именем "msrepl_tran_version". Это привело к тому, что база данных не соответствовала сгенерированным классам, что может привести к этому сообщению об ошибке. Просто убедитесь, что ваша база данных и классы совпадают.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top