Я вхожу в 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>();
}
}
Есть ли какая-то конкретная причина, по которой возникает эта ошибка? Я попытался включить миграцию и включить автоматическую миграцию без какой-либо помощи.
источник
OnModelCreating
если ваши сущности находятся в той же сборке, что и вашиDbContext
. Я никогда не использовал аннотации данных для сущностей, поэтому не могу сказать наверняка. Вы всегда можете сканировать сборки в вашем,OnModelCreating
чтобы найти объекты в других сборках и зарегистрировать их автоматически (что делает Tripod).По-видимому, эта ошибка очень общая, она может иметь ряд причин. В моем случае это было следующее: Строка подключения (в Web.config), сгенерированная
.edmx
неверной. После почти целого дня, пытаясь все, я изменил строку подключения из строки EF на строку ADO.NET. Это решило мою проблему.Например, строка EF выглядит примерно так:
И строка ADO.NET выглядит так:
Источник: http://msdn.microsoft.com/nl-nl/data/jj556606.aspx
источник
EF 4.x
доEF 6
. Мне пришлось восстановить строку подключения, чтобы добавить таблицу (DatabaseFirst
). Я не заметил, что мои строки подключения вapp.config
иweb.config
были разными. Как только я взял наconnectionstring
себяapp.config
, он начал работать.Для меня проблема заключалась в том, что я не включил класс сущностей в свой набор БД в контексте структуры сущностей.
источник
Вы можете попробовать удалить таблицу из модели и добавить ее снова. Вы можете сделать это визуально, открыв файл .edmx в обозревателе решений.
шаги:
источник
Проблема может быть в строке подключения. Убедитесь, что ваша строка соединения для поставщика SqlClient, без метаданных, связанных с EntityFramework.
источник
Я видел эту ошибку, когда существующая таблица в базе данных не отображается должным образом в первую модель кода. В частности, у меня есть char (1) в таблице базы данных и char в C #. Изменение модели на строку решило проблему.
источник
Моя проблема была решена путем обновления части метаданных строки подключения. Очевидно это указывало на неправильную ссылку .csdl / .ssdl / .msl.
источник
Еще одна вещь, чтобы проверить с вашей строкой подключения - название модели. Я использовал две модели сущностей, сначала БД. В конфиге я скопировал соединение сущности для одного, переименовал его и изменил часть строки соединения. Что я не изменил, так это название модели, поэтому, хотя модель сущностей генерировалась правильно, когда был запущен контекст, EF искал не ту модель для сущностей.
Выглядит очевидно записанным, но я не вернусь четыре часа назад.
источник
Для меня проблема заключалась в том, что я использовал
connection string
сгенерированныйADO.Net
Model (.edmx). Изменение строки подключения решило мою проблему.источник
Это также может произойти, если вы используете постоянный кеш модели, который по той или иной причине устарел. Если ваш контекст был кэширован в файл EDMX в файловой системе (через DbConfiguration.SetModelStore), то OnModelCreating никогда не будет вызываться, поскольку будет использоваться кэшированная версия. В результате, если в вашем кэшированном хранилище отсутствует сущность, вы получите вышеуказанную ошибку, даже если строка соединения верна, таблица существует в базе данных и сущность настроена правильно в вашем DbContext.
источник
Сообщение было довольно ясным, но сначала я его не понял ...
Я работаю с двумя контекстами БД Entity Framework
sysContext
иshardContext
в том же методе.Сущность, которую я изменил \ обновил, происходит из одного контекста, но затем я попытался сохранить его в другом контексте следующим образом:
но правильная версия должна быть такой:
После передачи объекта в правильный контекст эта ошибка исчезла.
источник
Звучит очевидно, но убедитесь, что вы явно не игнорируете тип:
modelBuilder.Ignore<MyType>();
источник
Карта сущности (даже пустой), добавленная в конфигурацию, приведет к тому, что тип сущности будет частью контекста. У нас была сущность без отношения к другим сущностям, которая была исправлена пустой картой.
источник
если вы сначала пытаетесь использовать БД, убедитесь, что у вашей таблицы есть первичный ключ
источник
Visual Studio 2019, кажется, вызывает это для меня. Я исправил это, сгенерировав модель edmx снова в 2017 году.
источник
Я получаю ту же проблему в Entity Framewrok, и я решил ее с помощью следующих шагов:
1-Откройте ваш Model.edmx 2-измените место в таблице (для изменения в CS-файле) 3-сохраните его
Я надеюсь помочь тебе
источник
Удалите файл .edmx и добавьте его снова. Особенно, если вы обновили Entity Framework.
источник
Я столкнулся с той же проблемой с EntityFrameworkCore, пытаясь обновить диапазон значений.
Этот подход не сработал
После добавления метода UpdateRange и удаления вложения и ввода все работает
источник
Для меня это было вызвано, потому что я переименовал класс сущности. Когда я откатил это, это было хорошо.
источник
Может быть глупо, но если вы получили эту ошибку только в какой-то таблице, не забудьте очистить ваш проект и перестроить (может сэкономить много времени)
источник
У меня было это
Это был асинхронный метод, но я забыл поставить await перед GetEntryAsync, и поэтому я получил эту же ошибку ...
источник