При работе с кодом EF сначала я получаю сообщение об ошибке, приведенное ниже, в разное время:
Тип сущности SomeType не является частью модели для текущего контекста.
Каковы возможные причины этой ошибки?
При работе с кодом EF сначала я получаю сообщение об ошибке, приведенное ниже, в разное время:
Тип сущности SomeType не является частью модели для текущего контекста.
Каковы возможные причины этой ошибки?
Это может произойти, потому что:
MetaData
свойства EntityConnectionStringBuilder
(в форме "res://MyAssemblyThatContainsTheModel/"
). Я дал ему сборку, в которой не было встроенных ресурсов модели данных сущностей, и она просто построила модель без сущностей. Это произошло из-за того, что я использовал Assembly.GetCallingAssembly()
, который вернул неправильную сборку из-за встраивания метода JIT. Я пометил встроенные методы [MethodImpl(MethodImplOptions.NoInlining)]
, и это решило проблему.
- person Allon Guralnek; 19.12.2012
Я получил это, когда мой класс, унаследованный от 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› не является частью модели для текущего контекста
У меня была эта ошибка.
Оказалось, что я добавил новое поле в представление БД за несколько часов до этого. Я обновил контекст (как часть чего-то другого, что я делал) и получил эту ошибку.
Когда я обновил POCO, все было хорошо: EF выдал эту ошибку, потому что не смог сопоставить поле в представлении со свойством в POCO представления.
Не самое полезное сообщение об ошибке в этой ситуации IMO.
Это может произойти, если ваша модель неправильно сопоставлена с вашим классом. В моем случае я получил эту ошибку, когда использовал EF Model First и когда я обновил свою модель EDMX из БД, но не обновил свой класс Entity. В частности, свойство в Entity было в нижнем регистре, а в диаграмме DB и EDMX - в верхнем регистре. И еще одна проблема, с которой я столкнулся, заключалась в том, что свойство модели на диаграмме EDMX не было преобразовано в Enum моего приложения, поэтому EF не мог распознать эту сущность.
Сначала я работал с базой данных и использовал встроенную генерацию шаблонов для своих моделей (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 (в настоящее время предварительный код), код сначала и пользовательские соглашения. Оказывается, основная причина в том, что у меня было пользовательское соглашение, которое переименовывает идентификатор EdmProperty (например, ID -> MyTypeId). Если я отключу свое пользовательское соглашение, эта проблема исчезнет; если я включил свое соглашение, проблема возникает. Нет регистрации, исключений или других ошибок, указывающих на то, что при построении модели возникла проблема. Это исключение не всплывает, пока я не попытаюсь добавить сущность в DbSet. Соглашение не вызвало никаких проблем при создании базы данных (через миграцию).
В моем сценарии я использовал EF6 для переноса базы данных MySQL на MSSQL. У меня было 2 отдельные модели и контексты, каждая со своей строкой подключения. У классов было одно и то же имя, но в MySQL все строчные буквы, а в MSSQL — один регистр Pascal. Я скопировал обе строки подключения из соответствующих сборок, содержащих мои модели EDMX. Но когда я запустил свое приложение, я получил сообщение об ошибке, связанное с тем, что одна из двух строк подключения уже была добавлена в список словарей.
Поэтому я удалил конфликтующую запись, по глупости думая, что она каким-то образом имеет доступ к строке подключения в собственном файле app.config сборки (уже поздно!). Но нет, на самом деле ошибка происходила, потому что обе строки подключения также имели одно и то же имя — одна в нижнем регистре, а другая в регистре Pascal, т. е. ключ словаря игнорирует регистр. Поэтому, когда я удалил MySQL, он попытался использовать строку подключения MSSQL для ОБЕИХ моделей. Поэтому мне пришлось заново добавлять, переименовывать и вручную устанавливать строку подключения для второй модели в коде.