[c#] 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();
}


답변

Ladislav Mrnka의 답변에 대한 작은 설명입니다 (수용된 답변이어야 함).

저와 같은 경우 다음과 같은 형식의 코드가 있습니다.

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();
}

아마도 이것은 명백해 보이지만 처음에는 컨텍스트 뿐만 아니라 연결할 엔티티 를 지정해야한다는 것이 분명 하지 않았습니다 .


답변

Kjartans 설명을 적절하게 설명하기 위해 :

나는 :

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;
        }
    }


답변

나는이 질문이 꽤 오래되었다는 것을 알고 있지만 하나 이상의 클래스 / 서비스에서 레지스터를 삭제하고 각각이 자체 데이터베이스 연결 컨텍스트를 인스턴스화했기 때문에 위의 어느 것도 나를 위해 일하지 않았습니다.

내가 그것을 해결하기 위해 한 일은 데이터베이스에 액세스 할 나머지 클래스 / 서비스에 처음으로 생성 된 컨텍스트를 보내는 것이 었습니다.

예를 들어, serviceA레지스터 중 일부를 삭제하고 호출 serviceB하고 serviceC레지스터로 동일한 작업을 수행하려고했습니다.

나는 다음에 내 레지스터를 삭제할 것입니다 serviceA및 매개 변수로에서 생성 된 컨텍스트 패스 serviceA에를 serviceB하고 serviceC.


답변

이 코드를 작성할 수 있습니다.

var x=yourquery.FirstOrDefault();

sqlEntities.DeleteObject(x);
sqlEntities.SaveChanges();


답변

위의 방법 중 어느 것도 효과가없는 경우 다음 해결 방법을 시도해 볼 수 있습니다.


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


답변

제거하려는 목록에 개체가 있는지 확인해야합니다. 다음 조건을 입력해야합니다.

if (context.entity.contains (객체))

그것을 제거하십시오.

동등성에 대한 복잡한 조건이있는 경우 확장 메소드 “entity.contains”에 대한 올바른 방법을 얻으려면 동등성에 대한 조건을두기 위해 엔티티 클래스의 동등 메소드를 재정의해야합니다.