엔티티 프레임 워크 : 최근 컨텍스트에 추가 된 객체 재검색

entity-framework

문제

엔터티 프레임 워크를 사용하고 방금 만든 개체를 "다시 찾기"하는 데 문제가 있습니다. 기본적으로 다음과 같이 진행됩니다.

string theId = "someId";

private void Test()
{
  using(MyEntities entities = new MyEntities())
  {
    EntityObject o = new EntityObject();
    o.Id = theId;
    entities.AddToEntityObject(o);
    CallSomeOtherMethod(entities);
  }
}

void CallSomeOtherMethod(MyEntities ents)
{
  EntityObject search = ents.EntityObject.FirstOrDefault(o => o.Id == theId);
  if(search == null) 
  {
    Console.WriteLine("wha happened???");
  }
}

(코드가 작동하는지 보증하지 않습니다. 그것은 내 머리에서 온 것입니다.)

방금 생성 된 EntityObject를 "찾기"하지 않는 이유는 무엇입니까?

AddToEntityObject 후에 SaveChanges ()를 호출하면 (놀랄 일도 아닌) 작동하지만 캐시에서 제대로 가져 오지 않는 이유는 무엇입니까?

나는이 재료에 여전히 초록색이기 때문에, 내가 바라보고있는 정말 쉬운 것이 있다고 기대하고있다 ...

감사

수락 된 답변

이것은 ents.EntityObject.WhatEver가 항상 데이터 소스를 쿼리하기 때문에 발생합니다. 이것은 디자인 결정입니다. 다른 방법은 데이터 소스와 로컬 캐시에 대해 쿼리를 실행 한 다음 결과를 병합해야하기 때문입니다. 개발자 중 한 명이 블로그에서 지적했듯이 (정확히 어디에서 기억할 수 없는가?) 일관되게이를 처리하지 못했습니다.

상상할 수 있듯이 제대로 처리해야하는 모서리 케이스가 많이 있습니다. 데이터베이스에서 다른 사람이 만든 로컬에서 만든 ID를 찾을 수 있습니다. 이렇게하면 (거의) 모든 쿼리에서 충돌을 처리 할 수 있습니다. 어쩌면 그들은 데이터 소스를 쿼리하기 위해 로컬 캐시와 메소드를 쿼리하는 메소드를 만들 수 있었지만 똑똑하지는 않을 수도 있습니다.

Entity Framework 용 투명 지연로드를 살펴볼 수 있습니다. 이것은 일반 코드 생성기를 대체하며 액세스시 관련 엔터티 컬렉션과 엔터티 참조를 자동으로 채우는 엔터티를 가져옵니다. 이렇게하면

if (!Entity.ReleatedEntities.IsLoaded)
{
   Entity.RelatedEntities.Load();
}

코드 조각. 또한 컬렉션이 항상 암시 적으로로드되기 때문에 컬렉션을 쿼리 할 수 있습니다. 그러나이 솔루션은 완벽하지 않습니다. 몇 가지 문제가 있습니다. 예를 들어, 새 엔터티를 만들고 관련된 엔터티 컬렉션에 액세스하면 코드에서 데이터베이스에서 관련 엔터티를 검색 할 수 없기 때문에 예외가 발생합니다. 또한 데이터 바인딩과 관련한 문제가 있으며 더 잘 알지 못합니다.

좋은 점은 소스 코드를 가져 와서 직접 문제를 해결할 수 있다는 것입니다. 몇 시간을 발견하면 첫 번째 문제를 조사 할 것입니다. 하지만 엔터티가 방금 생성 된 엔터티가 예상 된 동작이 아닌 경우 데이터베이스를 누르지 않는 경우가 있기 때문에 수정하기가 쉽지 않을 것이라고 확신합니다.


인기 답변

새로 추가 된 객체는 데이터베이스에 아직 저장되지 않았으므로 로컬 데이터 소스에 있습니다. 따라서 EntityObject search = ents.EntityObject.FirstOrDefault(o => o.Id == theId) ?? ents.EntityObject.Local.FirstOrDefault(o => o.Id == theId); 라고 말할 수 있습니다 EntityObject search = ents.EntityObject.FirstOrDefault(o => o.Id == theId) ?? ents.EntityObject.Local.FirstOrDefault(o => o.Id == theId);



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.