Подтвердить что ты не робот

Информация 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'.

4b9b3361

Ответ 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();

Ответ 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. Это заставило базу данных не соответствовать сгенерированным классам, которые могут вызвать это сообщение об ошибке. Просто убедитесь, что ваша база данных и классы соответствуют.