EF Mapping и информация метаданных не могут быть найдены для EntityType Error - PullRequest
38 голосов
/ 28 февраля 2010

Я столкнулся с исключением при использовании Entity Framework 4.0 RC. Моя модель Entity Framework инкапсулирована в частную сборку с именем Procurement.EFDataProvider, а мои классы POCO находятся внутри другой сборки Procurement.Core Связь между Core (Business Logic) и EFDataProvider (Data Access) осуществляется с фабрикой DataProvider

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

objectSet = ObjectContext.CreateObjectSet<TEntity>();

Я получаю сообщение об ошибке:

Не удалось найти информацию сопоставления и метаданных для EntityType 'Procurement.Core.Entities.OrganizationChart'.

Ответы [ 13 ]

60 голосов
/ 09 августа 2010

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

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

Могут быть и другие причины.

НТН

12 голосов
/ 01 марта 2010

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

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

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

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

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

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

ObjectContext.Metadataworkspace.LoadFromAssembly();
3 голосов
/ 20 мая 2011

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

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

2 голосов
/ 14 января 2015

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

Решение:

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

Похожие посты .

2 голосов
/ 07 января 2012

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

2 голосов
/ 28 июля 2011

Я получил эту ошибку, потому что у меня было больше, чем 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.
1 голос
/ 24 июня 2012

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

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

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

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

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

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

  1. Откройте папку bin вашего exe-проекта и оставьте ее видимой.
  2. Постройте решение.
  3. Первый проект, который будет построен, - это проект доступа к данным, и вы можете видеть текущее время в папке bin как дату его изменения.
  4. Пока строятся другие проекты, вы увидите, что дата изменения проекта DataAccess была изменена на старую.

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

1 голос
/ 13 июля 2010

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

0 голосов
/ 04 июня 2013

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

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