Тип сущности не является частью модели для текущего контекста
Я вхожу в 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 ответов:
поместите это в свой пользовательский
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= "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>
для меня проблема заключалась в том, что я не включил класс сущности в свой набор БД внутри контекста для Entity framework.
public DbSet<ModelName> ModelName { get; set; }
проблема может быть в строке подключения. Убедитесь, что ваша строка подключения предназначена для поставщика SqlClient, без метаданных, связанных с EntityFramework.
вы можете попробовать удалить таблицу из модели и добавить ее снова. Вы можете сделать это визуально, открыв .файл edmx из Обозревателя решений.
действия:
- двойной щелчок .edmx файл из Обозревателя решений
- щелкните правой кнопкой мыши на голове таблицы, которую вы хотите удалить, и выберите "Удалить из модели"
- теперь снова щелкните правой кнопкой мыши на рабочей области и выберите пункт "Обновить модель из базы данных.."
- добавить таблицу из список таблиц
- "очистить и построить" решение
Я видел эту ошибку, когда существующая таблица в базе данных не соответствует первой модели кода. В частности, у меня был символ(1) в таблице базы данных и символ в C#. Изменение модели на строку решило проблему.
еще одна вещь, чтобы проверить с вашей строки подключения - название модели. Я использовал две модели сущностей, сначала DB. В конфигурации я скопировал соединение сущности для одного, переименовал его и изменил часть строки подключения. То, что я не изменил, было именем модели, поэтому, хотя модель сущности сгенерирована правильно, когда контекст был инициирован, EF искал неправильную модель для сущностей.
выглядит очевидным записано, но есть четыре часа я не вернусь.