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

Я вхожу в Entity Framework, но я не уверен, что мне не хватает критической точки в подходе code-first.

Я использую общий шаблон репозитория на основе кода из https://genericunitofworkandrepositories.codeplex.com/ и создали мои сущности.

но когда я пытаюсь получить доступ или изменить сущность, я сталкиваюсь со следующим:

система.InvalidOperationException: свойство типа сущности не является частью модели для текущего контекста.

это происходит, когда я пытаюсь получить доступ к нему из моего репозитория:

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>();
    }

}

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

11 ответов


поместите это в свой пользовательский DbContext класс:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Estate>().ToTable("Estate");
}

Если ваши таблицы не создаются при запуске, поэтому. Вам нужно сообщить DbContext о них в переопределении метода OnModelCreating.

вы можете либо сделать пользовательские сопоставления для каждой сущности здесь, либо разделить их на отдельные EntityTypeConfiguration<T> классы.


по-видимому, эта ошибка очень общая, она может иметь ряд причин. В моем случае это было следующее: строка подключения (в Интернете.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


для меня проблема заключалась в том, что я не включил класс сущности в свой набор БД в контекст для entity framework.

public DbSet<ModelName> ModelName { get; set; }

проблема может быть в строке подключения. Убедитесь, что строка подключения предназначена для поставщика SqlClient без метаданных, связанных с EntityFramework.


вы можете попробовать удалить таблицу из модели и добавить ее снова. Вы можете сделать это визуально, открыв .файл edmx из Обозревателя решений.

действия:

  1. двойной щелчок .файл edmx из Обозревателя решений
  2. щелкните правой кнопкой мыши на голове таблицы, которую вы хотите удалить, и выберите "Удалить из модели"
  3. теперь снова щелкните правой кнопкой мыши на рабочей области и выберите пункт "Обновить модель из базы данных.."
  4. добавить таблицу из список таблиц
  5. "очистить и построить" решение

Я видел эту ошибку, когда существующая таблица в базе данных не соответствует первой модели кода. В частности, у меня был char(1) в таблице базы данных и char в C#. Изменение модели на строку решило проблему.


еще одна вещь, которую нужно проверить с помощью строки подключения-имя модели. Я использовал две модели сущностей, сначала DB. В конфигурации я скопировал соединение сущности для одного, переименовал его и изменил часть строки соединения. Что я не изменил, так это имя модели, поэтому, хотя модель сущности сгенерирована правильно, когда контекст был инициирован, EF искал в неправильной модели для сущностей.

выглядит очевидным записано, но есть четыре часа я не вернусь.


Звучит очевидно, но убедитесь, что вы явно не игнорируете тип:

modelBuilder.Ignore<MyType>();


карта сущности (даже пустая), добавленная в конфигурацию, приведет к тому, что тип сущности будет частью контекста. У нас была сущность, не имеющая отношения к другим сущностям, которая была зафиксирована пустой картой.


Если вы пытаетесь DB сначала, то убедитесь, что ваша таблица имеет первичный ключ


для меня проблема заключалась в том, что я использовал connection string создается с помощью ADO.Net модель (.edmx в). Изменение строки подключения решило мою проблему.