Объект нельзя удалить, поскольку он не найден в ObjectStateManager

Я получаю эту ошибку «Объект нельзя удалить, потому что он не найден в ObjectStateManager».

Мой код:

protected MyEntities sqlEntities; public virtual void Delete(TEntity entity) { System.Type t = typeof(TEntity); sqlEntities.DeleteObject(entity); sqlEntities.SaveChanges(); } 

Это означает, что объект не присоединен (он не был загружен одним и тем же экземпляром контекста). Попробуй это:

 protected MyEntities sqlEntities; public virtual void Delete(TEntity entity) { sqlEntities.Attach(entity); sqlEntities.DeleteObject(entity); sqlEntities.SaveChanges(); } 

Просто небольшое разъяснение по поводу ответа Ладислава Мрнки (который должен быть принятым ответом).

Если мне нравится, у вас есть код в таком формате:

 using (var context = new MyDataContext()) { context.MyTableEntity.Remove(EntytyToRemove); var nrOfObjectsChanged = context.SaveChanges(); } 

.. то это то, что вы хотите сделать:

 using (var context = new MyDataContext()) { // Note: Attatch to the entity: context.MyTableEntity.Attach(EntityToRemove); context.MyTableEntity.Remove(EntityToRemove); var nrOfObjectsChanged = context.SaveChanges(); } 

Возможно, это кажется очевидным, но изначально мне было непонятно, что необходимо указать объект для привязки, а не только контекст .

Просто для того, чтобы наложить ответственность на объяснение Кьяртанса:

Я имел:

 public Project DeleteProject(int id) { using (var context = new Context()) { var p = GetProject(id); context.Projects.Remove(p); context.SaveChanges(); return p; } } 

Проблема в том, что я использовал свой собственный метод (GetProject ()) для получения объекта (следовательно, используя другой контекст для загрузки объекта):

 public Project GetProject(int id) { using (var context = new Context()) { var project = context.Projects .Include(p => p.Reports.Select(q => q.Issues.Select(r => r.Profession))) .Include(p => p.Reports.Select(q => q.Issues.Select(r => r.Room))) .SingleOrDefault(x => x.Id == id); return project; } } 

Одним из решений может быть присоединение загруженного объекта как состояния Kjartan, другое может быть моим решением, для загрузки объекта в том же контексте:

 public Project DeleteProject(int id) { using (var context = new Context()) { var p = context.Projects.SingleOrDefault(x => x.Id == id); if (p == null) return p; context.Projects.Remove(p); context.SaveChanges(); return p; } } 

Я знаю, что этот вопрос довольно старый, но ни один из вышеперечисленных не работал для меня, так как я удалял регистры из более чем одного classа / службы, и каждый из них создавал экземпляр собственного контекста подключения к базе данных.

То, что я сделал для ее решения, – это отправить первый созданный контекст остальным classам / службам, которые будут обращаться к базе данных.

Например, моя serviceA собиралась удалить некоторые из ее регистров и вызвать serviceB и serviceC чтобы сделать то же самое со своими регистрами.

Затем я удаляю свои регистры на serviceA и serviceA в качестве параметра контекст, созданный на serviceA на serviceB и serviceC .

Если ни одно из вышеперечисленных действий не работает, вы можете попробовать это решение:

context.Entry(yourObject).State = System.Data.Entity.EntityState.Deleted; context.SaveChanges();

Вы можете написать этот код:

 var x=yourquery.FirstOrDefault(); sqlEntities.DeleteObject(x); sqlEntities.SaveChanges(); 

Вы должны быть уверены, что ваш объект существует в списке, который вы пытаетесь удалить, вы должны поставить следующее условие

if (context.entity.contains (ваш объект))

убери это.

если у вас есть сложное условие равенства, вы должны переопределить равный метод в classе сущности, чтобы поставить свое условие на равенство, чтобы получить правильный путь для метода расширения «entity.contains»

Убедитесь, что модель, проходящая в Remove (Entity), точно такая же, как и запись базы данных.

Несколько раз его можно было передать модели с некоторыми полями, такими как Id или Date. храните их в @ html.Hiddenfor, если вы публикуете форму.

Лучший способ – передать идентификатор и получить объект, используя метод Find (Id), и передать его Remove (Entity)

Надеюсь, это поможет кому-то.

  • Обновление отношений при сохранении изменений объектов EF4 POCO
  • Entity Framework объединяет 3 таблицы
  • Преобразование Entity Framework / Linq EXpression из строки в int
  • Уже есть открытый DataReader, связанный с этой Командой, который должен быть закрыт первым
  • Entity Framework 4 Удалить объект из коллекции объектов
  • Объекты самоконтроля и объекты POCO
  • Entity Framework - добавить свойство навигации вручную
  • Entity Framework / SQL2008 - Как автоматически обновлять поля LastModified для объектов?
  • Добавление сложных типов хранимых процедур в Entity Framework
  • String.Equals () не работает по назначению
  • Как сделать Entity Framework Data Context Readonly
  • Interesting Posts

    Как я могу выбрать, какой браузер получает ссылку из разных приложений в каждый момент?

    Как ограничить количество обновляемых документов в mongodb

    Будут ли мои приложения и файлы потеряны или МОЖЕТ быть потеряны?

    Как я могу запросить объекты, на которые ссылаются в MongoDB?

    Выполнение определенной цели плагина Maven из командной строки в подмодуле многомодульного проекта реактора

    Открытие приложения Shiny прямо в браузере по умолчанию

    Windows 7: Перенос профиля пользователя на другой компьютер вручную

    Hibernate: установить тайм-аут запроса по умолчанию?

    Синхронизированный аудиовыход на нескольких компьютерах? VLC? Аппаратные решения?

    Как остановить итерацию и вернуть ошибку, когда Iterator :: map возвращает результат: Err?

    java – Как бы я динамически добавлял компонент swing в gui при нажатии?

    Как я могу сказать jaxb / Maven для создания нескольких пакетов схем?

    Доступ к локальному хосту на Mac OS X с машины Parallels

    Как вы извлекаете / устанавливаете из файла .iso?

    scanf () оставляет новый символ строки в буфере

    Давайте будем гением компьютера.