it-swarm.com.ru

EF 4.1 Code First error - тип сущности SomeType не является частью модели для текущего контекста

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

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

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

42
rovsen

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

  • DbContext настроен с неверной строкой подключения 
  • Указанный объект на самом деле не отображается в конфигурации
40
rovsen

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

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

    // etc. ... 
}
14
GraehamF

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

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

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

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

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

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

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

5
Doug Kimzey

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

1
Amir Chatrbahr

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

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

1
Aaron Bar

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

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

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

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

1
Neil Thompson

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

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

0
Breeno

ОБНОВЛЕНИЕ

Эта ошибка продолжала атаковать меня различными обновлениями, которые я делал в базе данных. В конце концов я удалил файл 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
    }
}

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

0
P.Brian.Mackey

Сначала я делаю базу данных и использую встроенную генерацию шаблонов для своих моделей (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 (это также означает Role POCO), исключение исчезнет.

0
mbursill

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

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

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

0
crimbo