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


Я вхожу в 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>();
    }

}

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

11 110

11 ответов:

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

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

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

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

по-видимому, эта ошибка очень общая, она может иметь ряд причин. В моем случае это было следующее: строка подключения (в Web.конфигурации), генерируемых .edmx был признан недействительным. После почти дня попыток все, я изменил строку подключения из строки EF в строку an 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. "очистить и построить" решение

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

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

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

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

modelBuilder.Ignore<MyType>();

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

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

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