Во время работы с кодом EF сначала я получаю ошибку, указанную ниже в разное время:
Тип объекта SomeType не является частью модели для текущего контекста.
Каковы возможные причины этой ошибки?
Во время работы с кодом EF сначала я получаю ошибку, указанную ниже в разное время:
Тип объекта SomeType не является частью модели для текущего контекста.
Каковы возможные причины этой ошибки?
Это может произойти, потому что:
Я получил это, когда мой класс, унаследованный от DbContext, не объявил модель как свойство. Например, я забыл добавить свойство для FooModel в код ниже:
public class MyDBContext : DbContext
{
public DbSet<FooModel> FooModels{ get; set; }
// etc. ...
}
Это сообщение также появляется, если вы попытаетесь сделать что-то такое множество EntityState в дочерней коллекции в ассоциации "один ко многим".
Например; если между приведенными ниже фрагментами кода ParentEnt и ChildEnt существует ассоциация "один ко многим", появляется сообщение об ошибке:
Тип объекта Hash1Type не является частью модели для текущего контекста.
MyDbContext.Entry(ParentEnt.ChildEnt).State = EntityState.Unchanged;
Следующее изменение не вызывает ошибки:
MyDbContext.Entry(ParentEnd.ChildEnt.First).State = EntityState.Unchanged;
Обратите внимание, что использование First()
в этом случае может означать t
Это также может быть вызвано тем, что свойства вашего POCO не называются ТОЧНО, как они есть в EDMX/modelbuilder. Пожалуйста, ознакомьтесь с моим сообщением здесь, чтобы узнать, как я могу решить проблему.
Тип сущности <class> не является частью модели для текущего контекста
У меня была эта ошибка.
Оказалось, что я добавил новое поле в db View несколько часов назад. Я обновил контекст (как часть чего-то еще, что я делал) и получил эту ошибку.
Когда я обновил POCO, все было хорошо: EF выбросила эту ошибку, потому что она не могла отобразить поле в представлении в свойство в POCO представления.
Не самое полезное сообщение об ошибке в этой ситуации IMO.
Это может произойти, если ваша модель неправильно сопоставлена с вашим классом. В моем случае я получил эту ошибку, когда использовал EF Model First и когда я обновил модель EDMX от БД, но не обновил свой класс Entity. В частности, свойство в Entity было в нижнем регистре, тогда как в DB и EDMX диаграмма была в верхнем случае. И еще одна проблема, с которой я столкнулся, - это свойство модели в диаграмме EDMX не было преобразовано в мое приложение Enum. Так что EF не смог распознать Entity.
Сначала я делал базу данных и использовал встроенные шаблоны для своих моделей (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), исключение исчезнет.
ОБНОВЛЕНИЕ
Эта ошибка продолжала атаковать меня различными обновлениями, которые я сделал в базе данных. В конце концов я удалил файл 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
}
}
Я добавил свойство после генерации исходной модели. Однако я даже попытался удалить стол и воссоздать его. Это не исправить. Только добавление свойства вручную исправило это для меня.
Отвечая на вопрос: "Каковы возможные причины этой ошибки?":
Эта ошибка возникает в любое время, когда внутренняя/EDMX-модель не была успешно построена или не была полностью построена. И есть много потенциальных причин для этой проблемы. К сожалению, кажется, что при создании модели, по-видимому, недостаточно сообщений об ошибках или обнаружении ошибок, поэтому решение проблемы, похоже, связано с попыткой кучи вещей увидеть, что заставляет проблему уйти.
Я столкнулся с другим экземпляром этой ошибки за последние несколько дней, используя EF 6.0 (в настоящее время - предварительный код), кодовые и пользовательские соглашения. Оказывается, основная причина в том, что у меня было специальное соглашение, которое переименовывает ID EdmProperty (например, ID → MyTypeId). Если я отключил свое обычное соглашение, эта проблема исчезла; если я включил свое соглашение, проблема возникнет. Не существует никаких протоколов или исключений или других ошибок, указывающих на возникновение проблемы при создании модели. Это исключение не поднимает голову, пока я не попытаюсь добавить объект в DbSet. Соглашение не вызывало проблем при создании базы данных (через Migrations).
В моем сценарии я использовал EF6 для переноса базы данных MySQL в MSSQL. У меня было две отдельные модели и контексты, каждая со своей собственной строкой соединения. Классы имели одно и то же имя, но в MySQL каждый был строчным и MSSQL одним корпусом Pascal. Я скопировал в обеих строках соединения из соответствующих сборок, содержащих мои модели EDMX. Но когда я запустил приложение, я получил сообщение об ошибке, когда одна из двух строк соединения уже добавлена в список словарей.
Итак, я удалил конфликтную запись, глупо думая, что у нее каким-то образом был доступ к строке подключения в сборке собственного app.config(это поздно!). Но нет, ошибка на самом деле происходила, потому что обе строки соединения также имели одно и то же имя - одно нижнее и одно в корпусе Pascal, то есть ключ словаря игнорирует корпус. Поэтому, когда я удалил MySQL, он попытался использовать строку соединения MSSQL для моделей BOTH. Поэтому мне пришлось повторно добавить, переименовать и вручную установить строку подключения для второй модели в коде.