Информация EF Mapping и metadata не найдена для EntityType Error
Я столкнулся с исключением, когда я использую Entity Framework 4.0 RC.
Моя модель Entity Framework инкапсулирована в частную сборку, имя которой - Procurement.EFDataProvider и мои классы POCO находятся внутри другой сборки. Procurement.Core
Связь между Core (Business Logic) и EFDataProvider (Data Access) осуществляется с помощью factory с именем DataProvider
поэтому, когда я пытаюсь создать objectet
objectSet = ObjectContext.CreateObjectSet<TEntity>();
Я получаю сообщение об ошибке:
Информация о сопоставлении и метаданных не найдена для EntityType 'Procurement.Core.Entities.OrganizationChart'.
Ответы
Ответ 1
Для всех, кто имеет дело с ошибкой, я думаю, что стоит упомянуть некоторые сценарии, которые я нашел, которые вызывают эту (крайне бесполезную) ошибку:
- Неверные свойства (с учетом регистра!)
- Свойства, отсутствующие в классе POCO
- Несоответствие типов между POCO и сущностью (например, int вместо long)
- Перечисления в POCO (EF не поддерживает перечисления прямо сейчас, насколько я понимаю)
Могут быть и другие причины.
НТН
Ответ 2
Вероятно, это связано с тем, что EF не может найти встроенную информацию о сопоставлении. В вашей строке подключения у вас, вероятно, будет что-то вроде его:
metadata=res://*/Models.MyModels.csdl|...etc
Это * - это подстановочный знак, рассказывающий контексту объекта, чтобы попытаться найти встроенную информацию о сопоставлении, по-моему, для сканирования всех загруженных сборок. Если сборка не загружена, EF ее не найдет.
Что вам нужно сделать, это предоставить строку соединения с дополнительной информацией о том, где встроена ваша информация о сопоставлении. Измените * на конкретное имя сборки вашего кода сопоставления:
metadata=res://Procurement.EFDataProvider/Models.MyModels.csdl
Если это не удается, найдите сборку и непосредственно загрузите ее в свой ObjectContext, используя:
ObjectContext.Metadataworkspace.LoadFromAssembly();
Ответ 3
Не имеет прямого отношения к вышесказанному, но если вы получите это сообщение об ошибке, и вы смешали POCO и обычную модель: плохая идея!
См. также комментарий от JRoppert в EF4 POCO (не используя T4): информация об отображении и метаданных не найдена для EntityType (спасибо JRoppert!)
Ответ 4
Я получал эту ошибку, потому что у меня было больше файла 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.
Ответ 5
Я также видел это, когда строка подключения не указана в файле конфигурации.
Ответ 6
Другая возможная проблема: , если вы используете code-first, а тип вашей сущности , определенный в отдельной сборке, где определяется контекст, и у вас нет добавлены любые пользовательские сопоставления методу OnModelCreating(DbModelBuild modelBuilder)
, тогда EF, похоже, игнорирует аннотации данных.
Решение:
Добавьте modelBuilder.Entity<YourEntityType>();
в метод OnModelCreating(DbModelBuild modelBuilder)
.
Связанный пост.
Ответ 7
Просто проверьте правильность свойств с помощью модели
Ответ 8
Там может быть и другая причина. Я также натягивал волосы на ночь.
Я выяснил, что в ссылках в решении есть какое-то нарушение. В моем проекте edmx
принадлежит проекту под названием DataAccess.Dll
. Но у меня нет ссылки на нее из моего exe. Из моего exe у меня есть ссылка на другой проект под названием Business.Dll
, и этот проект имеет ссылку и старое местоположение для DataAccess.Dll
.
Проведите следующий тест, чтобы узнать, есть ли у вас такая проблема:
- Откройте директорию bin вашего проекта exe и сохраните его.
- Постройте решение.
- Первый проект, который будет создан, - это проект доступа к данным, и вы можете увидеть в папке bin текущее время в качестве его модифицированной даты.
- В то время как другие проекты построены, вы увидите, что измененная дата проекта DataAccess была изменена на старую.
Вам нужно проверить свои ссылки и убедиться, что они ссылаются на местоположения обновлений ваших DLL.
Ответ 9
ошибка noob. Но у меня была ошибка, когда мой доступ к БД состоял из имени пользователя и пароля только для чтения. Надеюсь, что мои ошибки помогут другим.
Ответ 10
У меня была аналогичная проблема. У меня уже был один файл EDMX для одной базы данных с использованием классов POCO и объекта контекста, который я написал сам. Когда я добавил второй EDMX для другой базы данных, я использовал шаблон POCO T4, а затем ни один EDMX не работал и не запустил указанную вами ошибку. Чтобы решить эту проблему, я отказался от своих пользовательских POCO и контекстов и использовал только шаблон T4, и все снова работало хорошо.
Ответ 11
У меня возникла проблема, когда я добавил несколько столбцов в таблицу.
В сопоставлениях таблиц я переименовал имена столбцов.
Хотя я запустил "Transform All Templates" и перестроил приложение, я все равно получил "Связанный тип метаданных для type < > содержит следующие неизвестные свойства или поля < > ".
Класс для этой таблицы в Domain.Poco.tt был прав, но я нашел соответствующий файл класса .Metadata.cs в Domain.Poco.MetaData.tt не обновлялся и имел новые столбцы с исходными именами - а не новые, которые я указал в Table Mapping.
Решение? Я просто удалил класс злоумышленников метаданных и повторно запустил "Transform All Templates", и он был правильно воссоздан с правильными именами столбцов/функций.
Ответ 12
В моем случае это была очень важная проблема, и отображение было не таким, как ожидалось. Что случилось со мной, так это то, что я переместил свойство в "Наследование на иерархию таблицы" из одного из подклассов в базовый класс и забыл обновить модель.
У меня есть пользовательский POCO и копирование edmx файла в пустой новый проект и дайте ему автогенерировать объекты, а затем сравните их с тем, что я помог мне найти разницу.
Ответ 13
Моя проблема заключалась в том, что я редактировал шаблон T4, чтобы исключить поле репликации с именем msrepl_tran_version. Это заставило базу данных не соответствовать сгенерированным классам, которые могут вызвать это сообщение об ошибке. Просто убедитесь, что ваша база данных и классы соответствуют.