Тип сущности <type> не является частью модели для текущего контекста
Я попадаю в Entity Framework, но я не уверен, что мне не хватает критической точки в кодовом подходе.
Я использую общий шаблон репозитория на основе кода https://genericunitofworkandrepositories.codeplex.com/ и создал мои сущности.
Но когда я пытаюсь получить доступ или изменить объект, я запускаю следующее:
System.InvalidOperationException: тип объекта Estate не является частью модели для текущего контекста.
Это происходит, когда я пытаюсь получить к нему доступ из своего репозитория:
public virtual void Insert(TEntity entity)
{
((IObjectState)entity).ObjectState = ObjectState.Added;
_dbSet.Attach(entity); // <-- The error occurs here
_context.SyncObjectState(entity);
}
База данных (./SQLEXPRESS) создается просто отлично, но сущности (таблицы) просто не создаются при запуске.
Мне интересно, нужно ли явно указывать отображение сущностей? Неужели EF не может этого сделать самостоятельно?
Моя сущность:
public class Estate : EntityBase
{
public int EstateId { get; set; }
public string Name { get; set; }
}
Мой контекст такой:
public partial class DimensionWebDbContext : DbContextBase // DbContextBase inherits DbContext
{
public DimensionWebDbContext() :
base("DimensionWebContext")
{
Database.SetInitializer<DimensionWebDbContext>(new CreateDatabaseIfNotExists<DimensionWebDbContext>());
Configuration.ProxyCreationEnabled = false;
}
public new IDbSet<T> Set<T>() where T : class
{
return base.Set<T>();
}
}
Есть ли какая-то конкретная причина возникновения этой ошибки? Я попытался включить миграцию и включить автоматическую миграцию без какой-либо помощи.
Ответы
Ответ 1
Поместите это в свой собственный класс DbContext
:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Estate>().ToTable("Estate");
}
Если ваши таблицы не созданы при запуске, вот почему. Вы должны сообщить об этом DbContext в переопределении метода OnModelCreating.
Здесь вы можете либо создавать пользовательские сопоставления для каждого объекта, либо выделять их в отдельные классы EntityTypeConfiguration<T>
.
Ответ 2
По-видимому, эта ошибка очень общая, она может иметь ряд причин. В моем случае это было следующее: Строка подключения (в Web.config), сгенерированная .edmx
, была недействительной. После почти дня попытки все, я изменил строку соединения от строки EF до строки ADO.NET. Это решило мою проблему.
Например, строка EF выглядит примерно так:
<connectionStrings>
<add name="BlogContext"
connectionString="metadata=res://*/BloggingModel.csdl|
res://*/BloggingModel.ssdl|
res://*/BloggingModel.msl;
provider=System.Data.SqlClient
provider connection string=
"data source=(localdb)\v11.0;
initial catalog=Blogging;
integrated security=True;
multipleactiveresultsets=True;""
providerName="System.Data.EntityClient" />
</connectionStrings>
И строка ADO.NET выглядит так:
<connectionStrings>
<add name="BlogContext"
providerName="System.Data.SqlClient"
connectionString="Server=.\SQLEXPRESS;Database=Blogging;
Integrated Security=True;"/>
</connectionStrings>
Источник: http://msdn.microsoft.com/nl-nl/data/jj556606.aspx
Ответ 3
Для меня проблема заключалась в том, что я не включил класс Entity в мой db-набор внутри контекста для фреймворка сущности.
public DbSet<ModelName> ModelName { get; set; }
Ответ 4
Проблема может быть в строке соединения. Убедитесь, что ваша строка соединения предназначена для поставщика SqlClient, без материала метаданных, относящегося к EntityFramework.
Ответ 5
Вы можете попытаться удалить таблицу из модели и добавить ее снова. Вы можете сделать это визуально, открыв файл .edmx из Обозревателя решений.
Шаги:
- Дважды щелкните файл .edmx в обозревателе решений
- Щелкните правой кнопкой мыши на заголовке таблицы, который хотите удалить, и выберите "Удалить из модели"
- Теперь снова щелкните правой кнопкой мыши на рабочей области и выберите "Обновить модель из базы данных".
- Добавить таблицу из списка таблиц
- Очистите и постройте решение.
Ответ 6
Я видел эту ошибку, когда существующая таблица в базе данных не сопоставляется с первой моделью кода. В частности, я имел char (1) в таблице базы данных и char в С#. Изменение модели на строку разрешило проблему.
Ответ 7
Моя проблема была решена путем обновления части метаданных строки подключения. Очевидно это указывало на неправильную ссылку .csdl/.ssdl/.msl.
Ответ 8
Еще одна вещь, которую нужно проверить со своей строкой подключения - имя модели. Сначала я использовал две модели сущностей, БД. В конфиге я скопировал соединение сущности для одного, переименовал его и изменил часть строки соединения. То, что я не изменил, было именем модели, поэтому, пока модель сущности сгенерирована правильно, когда был инициирован контекст, EF искал неправильную модель для объектов.
Выглядит явно, но четыре часа я не вернусь.
Ответ 9
Для меня проблема в том, что я использовал connection string
, порожденную ADO.Net
Model (EDMX -). Изменение строки подключения решило мою проблему.
Ответ 10
Это также может произойти, если вы используете постоянный кеш модели, который по той или иной причине устарел. Если ваш контекст был кэширован в файл EDMX в файловой системе (через DbConfiguration.SetModelStore), то OnModelCreating никогда не будет вызываться, поскольку будет использоваться кэшированная версия. В результате, если в вашем кэшированном хранилище отсутствует сущность, вы получите вышеуказанную ошибку, даже если строка соединения верна, таблица существует в базе данных и сущность настроена правильно в вашем DbContext.
Ответ 11
Звучит очевидно, но убедитесь, что вы явно не игнорируете тип:
modelBuilder.Ignore<MyType>();
Ответ 12
отображение объекта (даже пустого), добавленного в конфигурацию, приведет к тому, что тип объекта будет частью контекста. У нас была сущность, не имеющая отношения к другим объектам, которые были установлены с пустой картой.
Ответ 13
Это также может происходить в структуре типов, отличной от сущности, например, от некорректного несоответствия данных и/или отсутствующих полей.
Ответ 14
если вы сначала пытаетесь использовать БД, убедитесь, что у вашей таблицы есть первичный ключ
Ответ 15
Visual Studio 2019, кажется, вызывает это для меня. Я исправил это, сгенерировав модель edmx снова в 2017 году.
Ответ 16
Сообщение было довольно ясным, но сначала я его не понял...
Я работаю с двумя контекстами БД Entity Framework sysContext
и shardContext
в одном методе.
Объект, который я изменил\обновил, взят из одного контекста, но затем я попытался сохранить его в другом контексте следующим образом:
invite.uid = user.uid;
sysContext.Entry(invite).State = EntityState.Modified;
sysContext.SaveChanges(); // Got the exception here
но правильная версия должна быть такой:
invite.uid = user.uid;
shardContext.Entry(invite).State = EntityState.Modified;
shardContext.SaveChanges();
После передачи объекта в правильный контекст эта ошибка исчезла.