Я получаю сообщение об ошибке «Объект не может быть удален, потому что он не найден в ObjectStateManager».
Мой код:
protected MyEntities sqlEntities;
public virtual void Delete(TEntity entity)
{
System.Type t = typeof(TEntity);
sqlEntities.DeleteObject(entity);
sqlEntities.SaveChanges();
}
var entity = new TEntity() { PK_ID = 23 }; sqlEntities.DeleteObject(entity);
я пытался создать фиктивный объект с правильной установкой PK в надежде, что Entity Framework вызовет DeleteObject на основе PKОтветы:
Это означает, что объект не прикреплен (он не был загружен тем же экземпляром контекста). Попробуй это:
источник
Просто небольшое пояснение к ответу Ладислава Мрнки (который должен быть принятым ответом).
Если, как и я, у вас есть код в таком формате:
... тогда это то, что вы хотите сделать:
Возможно, это кажется очевидным, но мне изначально не было ясно, что необходимо указать сущность, к которой нужно привязаться, а не только контекст .
источник
Просто чтобы перейти к объяснению Кьяртана:
Я имел:
Проблема в том, что я использовал свой собственный метод (GetProject ()) для получения объекта (следовательно, использовал другой контекст для загрузки объекта):
Одним из решений может быть присоединение загруженного объекта, как утверждает Кьяртан, другим может быть мое решение для загрузки объекта в том же контексте:
источник
Я знаю, что этот вопрос довольно старый, но ничего из вышеперечисленного не помогло мне, так как я удалял регистры из более чем одного класса / службы, и каждый из них создавал экземпляр своего собственного контекста подключения к базе данных.
Чтобы решить эту проблему, я отправил первый созданный контекст остальным классам / службам, которые собирались получить доступ к базе данных.
Например, я
serviceA
собирался удалить некоторые из своих регистров и вызватьserviceB
иserviceC
сделать то же самое с их регистрами.Затем я бы удалил свои регистры
serviceA
и передал в качестве параметра контекст, созданныйserviceA
дляserviceB
иserviceC
.источник
Вы можете написать этот код:
источник
Если ничего из вышеперечисленного не помогло, вы можете попробовать следующее решение:
context.Entry(yourObject).State = System.Data.Entity.EntityState.Deleted; context.SaveChanges();
источник
Вы должны быть уверены, что ваш объект существует в списке, из которого вы пытаетесь удалить, вы должны поставить следующее условие
если у вас есть сложное условие равенства, вы должны переопределить метод равенства в классе сущности, чтобы поставить условие равенства, чтобы получить правильный способ для метода расширения entity.contains
источник
Убедитесь, что модель, передаваемая в Remove (Entity), точно такая же, как и запись в базе данных.
Иногда можно передать модель без некоторых полей, таких как Id или Date. сохраните их в @ html.Hiddenfor, если вы публикуете как форму.
Лучший способ - передать идентификатор и получить объект с помощью метода Find (Id) и передать его в Remove (Entity).
Надеюсь, это кому-то поможет.
источник
Я получил эту проблему и решил ее. Просто скопируйте приведенный ниже код:
источник
В моем случае был один контекст, но я получил объект с опцией AsNoTracking
источник