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

EF 4.1 Code Первая ошибка. Тип объекта SomeType не является частью модели для текущего контекста.

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

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

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

4b9b3361

Ответ 1

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

  • DbContext настроен с неправильной строкой соединения
  • Указанная сущность фактически не отображается в конфигурации

Ответ 2

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

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

    // etc. ... 
}

Ответ 3

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

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

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

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

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

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

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

Ответ 5

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

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

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

ОБНОВЛЕНИЕ

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

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

Ответ 9

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

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

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

Ответ 10

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

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