Ошибка EF 4.1 Code First — тип сущности SomeType не является частью модели для текущего контекста.

При работе с кодом EF сначала я получаю сообщение об ошибке, приведенное ниже, в разное время:

Тип сущности SomeType не является частью модели для текущего контекста.

Каковы возможные причины этой ошибки?


person rovsen    schedule 12.04.2011    source источник
comment
Не могли бы вы скинуть код вашей модели?   -  person Sergi Papaseit    schedule 12.04.2011


Ответы (10)


Это может произойти, потому что:

  • DbContext настроен с неправильной строкой подключения
  • Указанный объект фактически не отображается в конфигурации
person rovsen    schedule 12.04.2011
comment
Проверьте строку подключения. Я столкнулся с той же проблемой, когда скопировал строку подключения для одного файла .edmx в другой. Это не работает. - person Shreedhar Kotekar; 21.03.2012
comment
@Shreedhar В сценарии arch строка подключения не имеет метаданных (создаваемых файлом EDMX). Возможно, вы могли бы помочь с этим вопросом: stackoverflow.com/questions/13634819/ - person one.beat.consumer; 30.11.2012
comment
Я создавал строку подключения вручную, поэтому для меня это произошло из-за того, что я предоставил неверную сборку для свойства MetaData свойства EntityConnectionStringBuilder (в форме "res://MyAssemblyThatContainsTheModel/"). Я дал ему сборку, в которой не было встроенных ресурсов модели данных сущностей, и она просто построила модель без сущностей. Это произошло из-за того, что я использовал Assembly.GetCallingAssembly(), который вернул неправильную сборку из-за встраивания метода JIT. Я пометил встроенные методы [MethodImpl(MethodImplOptions.NoInlining)], и это решило проблему. - person Allon Guralnek; 19.12.2012
comment
Я обнаружил, что это было причиной этой проблемы, когда я неправильно настроил AutoFixture, чтобы он переустанавливал свойства (включая строку подключения) DbContext. - person Sam; 30.08.2013

Я получил это, когда мой класс, унаследованный от DbContext, не объявил модель как свойство. Например, я забыл добавить свойство для FooModel в приведенном ниже коде:

public class MyDBContext : DbContext
{
    public DbSet<FooModel> FooModels{ get; set; }

    // etc. ... 
}
person GraehamF    schedule 23.11.2012
comment
+1 Это именно та проблема, с которой я столкнулся. Спасибо! - person Samuel; 17.12.2013

Это сообщение также появляется, если вы пытаетесь что-то сделать, например установить EntityState для дочерней коллекции в ассоциации "один ко многим".

Например; если между ParentEnt и ChildEnt в приведенном ниже фрагменте кода существует связь «один ко многим», сообщение об ошибке:

Тип объекта Hash1Type не является частью модели для текущего контекста.

MyDbContext.Entry(ParentEnt.ChildEnt).State = EntityState.Unchanged;

Следующее изменение не приводит к ошибке:

MyDbContext.Entry(ParentEnd.ChildEnt.First).State = EntityState.Unchanged;

Обратите внимание, что использование First() в этом случае может означать t

person Doug Kimzey    schedule 24.08.2012

Это также может быть вызвано тем, что свойства вашего POCO не названы ТОЧНО так, как они указаны в EDMX/modelbuilder. Пожалуйста, смотрите мой пост здесь для получения подробной информации о том, как я решил проблему.

Тип объекта ‹class› не является частью модели для текущего контекста

person Aaron Bar    schedule 14.12.2012

У меня была эта ошибка.

Оказалось, что я добавил новое поле в представление БД за несколько часов до этого. Я обновил контекст (как часть чего-то другого, что я делал) и получил эту ошибку.

Когда я обновил POCO, все было хорошо: EF выдал эту ошибку, потому что не смог сопоставить поле в представлении со свойством в POCO представления.

Не самое полезное сообщение об ошибке в этой ситуации IMO.

person Neil Thompson    schedule 03.07.2013

Это может произойти, если ваша модель неправильно сопоставлена ​​с вашим классом. В моем случае я получил эту ошибку, когда использовал EF Model First и когда я обновил свою модель EDMX из БД, но не обновил свой класс Entity. В частности, свойство в Entity было в нижнем регистре, а в диаграмме DB и EDMX - в верхнем регистре. И еще одна проблема, с которой я столкнулся, заключалась в том, что свойство модели на диаграмме EDMX не было преобразовано в Enum моего приложения, поэтому EF не мог распознать эту сущность.

person Amir Chatrbahr    schedule 28.01.2015

Сначала я работал с базой данных и использовал встроенную генерацию шаблонов для своих моделей (EF 4.1).

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

Я предполагаю, что ошибка может указывать на то, что в вашей модели чего-то не хватает.

namespace TestApp.BLL
{
    using System;
    using System.Collections.Generic;

    public partial class User
    {
        public User()
        {
            //this.Roles = new HashSet<Role>();
        }

        public int UserId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }

        //public virtual ICollection<Role> Roles { get; set; }
    }
}

Приведенный выше код показывает закомментированные свойства навигации. Если я раскомментирую их для всех POCO (это также означает роль POCO), исключение исчезнет.

person mbursill    schedule 14.04.2011

ОБНОВЛЕНИЕ

Эта ошибка продолжала атаковать меня различными обновлениями, которые я вносил в базу данных. В конце концов я удалил файл edmx и просто создал его снова с теми же таблицами и сохраненными процессами.

Старый

Я получил это, когда в сгенерированном объекте отсутствовал столбец с нулевым значением:

//------------------------------------------------------------------------------
// <auto-generated>
//    This code was generated from a template.
//
//    Manual changes to this file may cause unexpected behavior in your application.
//    Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace MyProgram.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Question
    {
        public int id { get; set; }
        public string title { get; set; }
        public string body { get; set; }
        public string tags { get; set; }
        public int votes { get; set; }//I had to manually add this property which is nullable int in the database
    }
}

Я добавил это свойство после создания исходной модели. Однако я даже пытался удалить таблицу и создать ее заново. Это не исправило. Только добавление свойства вручную исправило его для меня.

person P.Brian.Mackey    schedule 01.04.2013

Отвечая на вопрос «Каковы возможные причины этой ошибки?»:

Эта ошибка возникает всякий раз, когда внутренняя модель/модель EDMX не строится успешно или строится не полностью. И есть большое количество потенциальных причин для этой проблемы. К сожалению, кажется, что при построении модели недостаточно сообщений об ошибках или обнаружения ошибок, поэтому для ее решения, похоже, нужно попробовать кучу вещей, чтобы увидеть, что устраняет проблему.

За последние несколько дней я столкнулся с другим случаем этой ошибки, используя EF 6.0 (в настоящее время предварительный код), код сначала и пользовательские соглашения. Оказывается, основная причина в том, что у меня было пользовательское соглашение, которое переименовывает идентификатор EdmProperty (например, ID -> MyTypeId). Если я отключу свое пользовательское соглашение, эта проблема исчезнет; если я включил свое соглашение, проблема возникает. Нет регистрации, исключений или других ошибок, указывающих на то, что при построении модели возникла проблема. Это исключение не всплывает, пока я не попытаюсь добавить сущность в DbSet. Соглашение не вызвало никаких проблем при создании базы данных (через миграцию).

person crimbo    schedule 14.08.2013

В моем сценарии я использовал EF6 для переноса базы данных MySQL на MSSQL. У меня было 2 отдельные модели и контексты, каждая со своей строкой подключения. У классов было одно и то же имя, но в MySQL все строчные буквы, а в MSSQL — один регистр Pascal. Я скопировал обе строки подключения из соответствующих сборок, содержащих мои модели EDMX. Но когда я запустил свое приложение, я получил сообщение об ошибке, связанное с тем, что одна из двух строк подключения уже была добавлена ​​в список словарей.

Поэтому я удалил конфликтующую запись, по глупости думая, что она каким-то образом имеет доступ к строке подключения в собственном файле app.config сборки (уже поздно!). Но нет, на самом деле ошибка происходила, потому что обе строки подключения также имели одно и то же имя — одна в нижнем регистре, а другая в регистре Pascal, т. е. ключ словаря игнорирует регистр. Поэтому, когда я удалил MySQL, он попытался использовать строку подключения MSSQL для ОБЕИХ моделей. Поэтому мне пришлось заново добавлять, переименовывать и вручную устанавливать строку подключения для второй модели в коде.

person Breeno    schedule 30.08.2015