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

Тип сущности <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>();
    }

}

Есть ли какая-то конкретная причина возникновения этой ошибки? Я попытался включить миграцию и включить автоматическую миграцию без какой-либо помощи.

4b9b3361

Ответ 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= 
                               &quot;data source=(localdb)\v11.0; 
                               initial catalog=Blogging;
                               integrated security=True; 
                               multipleactiveresultsets=True;&quot;" 
     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();

После передачи объекта в правильный контекст эта ошибка исчезла.