Информация о картировании и метаданных не может быть найдена для ошибки EntityType
-
23-09-2019 - |
Вопрос
Я столкнулся с исключением, когда использую 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
.
Сделайте следующий тест, чтобы увидеть, есть ли у вас такая проблема:
- Откройте директора Bin вашего проекта EXE и оставьте его видимым.
- Построить решение.
- Первый проект, который будет построен, - это проект доступа к данным, и вы можете увидеть в папке Bin текущее время в качестве модифицированной даты.
- В то время как другие проекты построены, вы увидите, что измененная дата проекта 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". Это привело к тому, что база данных не соответствовала сгенерированным классам, что может привести к этому сообщению об ошибке. Просто убедитесь, что ваша база данных и классы совпадают.