programing

ObjectStateManager에서 개체를 찾을 수 없으므로 개체를 삭제할 수 없습니다.

testmans 2023. 5. 15. 21:22
반응형

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

아마도 이것은 명백해 보이지만, 처음에는 문맥뿐만 아니라 첨부할 개체를 지정할 필요가 있다는 것이 명확하지 않았습니다.

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

위의 방법 중 하나도 효과가 없는 경우 다음 솔루션을 사용할 수 있습니다.

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

저는 이 질문이 꽤 오래된 질문이라는 것을 알고 있지만, 제가 두 개 이상의 클래스/서비스에서 레지스터를 삭제하고 각 클래스가 자체 데이터베이스 연결 컨텍스트를 인스턴스화하고 있었기 때문에 위의 질문 중 하나도 제게 도움이 되지 않았습니다.

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

예를 들어, 나의serviceA그것의 레지스터 중 일부를 삭제하고 전화하려고 했습니다.serviceB그리고.serviceC그들의 레지스터에도 동일한 작업을 수행합니다.

그러면 나는 내 레지스터를 삭제할 것입니다.serviceA그리고 매개 변수로 컨텍스트가 생성되었습니다.serviceA로.serviceB그리고.serviceC.

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

var x=yourquery.FirstOrDefault(); 

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

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

if(syslog.syslog(사용자의 개체))

그것을 제거합니다.

만약 당신이 동일성에 대한 복잡한 조건을 가지고 있다면, 당신은 엔티티 클래스에서 동일성에 대한 당신의 조건을 넣고, 확장 방법 "sys.method"에 대한 올바른 방법을 얻기 위해 동일성 클래스에서 동일한 방법을 재정의해야 합니다.

Remove(Entity)로 전달되는 모델이 데이터베이스 레코드와 정확히 일치하는지 확인합니다.

경우에 따라 ID 또는 날짜와 같은 일부 필드 없이 모델을 전달할 수 있습니다.그것들을 @filename에 보관합니다.양식으로 게시하는 경우 숨겨집니다.

가장 좋은 방법은 ID를 전달하고 Find(Id) 메서드를 사용하여 엔티티를 가져온 다음 Remove(Entity)로 전달하는 것입니다.

이것이 누군가에게 도움이 되기를 바랍니다.

저는 이 문제를 해결했습니다.아래 코드를 복사하면 됩니다.

sqlEntities.Attach(entity);
sqlEntities.Remove(entity);
sqlEntities.SaveChanges();

제 경우에는 하나의 컨텍스트가 있었지만 'AsNoTracking' 옵션을 사용하여 엔티티를 얻었습니다.

언급URL : https://stackoverflow.com/questions/7791149/the-object-cannot-be-deleted-because-it-was-not-found-in-the-objectstatemanager

반응형