Объект нельзя удалить, поскольку он не найден в 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)

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

  • Как сделать Entity Framework Data Context Readonly
  • Как отключить сущность из контекста в Entity Framework?
  • Создание динамических запросов с инфраструктурой сущностей
  • Инициализация платформы Entity - SLOW - что я могу сделать, чтобы быстрее запустить ее?
  • Entity Framework / Linq to SQL: Skip & Take
  • Использование свойств DateTime в Code-First Entity Framework и SQL Server
  • Лучший способ запросить страницу данных и получить общее количество в инфраструктуре сущностей 4.1?
  • Использование System.ComponentModel.DataAnnotations с Entity Framework 4.0
  • Уже есть открытый DataReader, связанный с этой Командой, который должен быть закрыт первым
  • Не удалось выполнить проверку для одного или нескольких объектов. Дополнительную информацию см. В разделе «Свойство EntityValidationErrors».
  • Обнаружено, что
  • Interesting Posts

    Как вставить разрыв строки перед элементом с использованием CSS

    SFINAE работает в обратном типе, но не как параметр шаблона

    tumblr аудио / видеоплееры + кладка с бесконечным прокруткой

    pinvokestackimbalance – как я могу это исправить или отключить?

    Стеганографическое программное обеспечение

    * .exe не является допустимым приложением win32

    измените оба названия легенды в ggplot с двумя легендами

    Что делает akamaihd.net?

    Невозможно назначить делегирование анонимного метода с менее конкретным типом параметра

    Удалите кнопку «Показывать рабочий стол» рядом с часами в Windows 7

    Рекомендации по хранению почтовых адресов в базе данных (РСУБД)?

    Имитировать низкий уровень заряда аккумулятора и низкую память в Android

    Как удалить определенные «самые посещаемые» сайты Chrome jumplists (Windows 10)?

    Удаление строки из огромного файла в Perl

    Как отправить электронное письмо с помощью C # через Gmail

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