Null 허용 관계에 대해 NULL
값을 반환하는 Entity Framework가 있습니다. 우리는 먼저 모델을 연구합니다. 이 문제는 엔티티의 관계가 다른 컨텍스트 (또는 실제 사용 사례 인 다른 스레드)에서 변경되었을 때 발생합니다.
- 탐색 속성이 아직 호출되지 않은 경우 null을 반환합니다.
- 네비게이션 속성이 호출되기 전에 호출되었거나 엔티티에 외래 키 속성이 포함되어있는 경우 마지막 알려진 값을 반환합니다.Null 허용 탐색 속성이 Entity Framework에서 null입니다.
:
- 게으른 로딩은 내가 엔티티 프레임 워크 4.0 및 6.0 둘 다 이것은 예를 들어 모델이다
같은 결과를 얻을 수에 대한 검사를하지
이것은 문제를 나타내는 몇 가지 예제 테스트 코드입니다.
int ID;
using (Model1Container1 context = new Model1Container1())
{
Dossier d = new Dossier();
d.Fase = new Fase();
context.DossierSet.AddObject(d);//generate new object with relationship
context.SaveChanges();
ID = d.Id;
}
using (Model1Container1 context = new Model1Container1())
{
Dossier storedDossier = context.DossierSet.Single(x => x.Id == ID);//retrieve the saved entity
using (Model1Container1 context2 = new Model1Container1())
{
Dossier faseDossier = context2.DossierSet.Single(x => x.Id == ID);//modify the saved entity in a different context
faseDossier.Fase = new Fase();
context2.SaveChanges();
}
Console.WriteLine(storedDossier.Fase.Id);//attempt to read the changed property. NULL exception here on storedDossier.Fase
}
이 코드는 우리의 실제 상황에서 같은 스레드를 사용하지 않지만, 같은 문제에 대해 설명합니다. 실제 응용 프로그램에서는 데이터베이스의 엔터티를 수정하는 다른 PC에 완전히 다른 응용 프로그램이있을 수 있습니다.
여기에있는 질문은 왜 이런 문제가 발생합니까? 엔티티 프레임 워크의 버그일까요?
엔티티 프레임 워크는 지연로드로 인해 엔티티가 인스턴스화되었을 때 존재했던 관계를 검색 할 수 없지만 왜 변경된 관계를로드하지 않는지는 분명합니다. 갑자기 NULL
값을받는 비 널 (NULL) 엔티티는 예기치 않은 무언가가 우리 모두에서 우리의 코드에서 고려 (그리고 왜 처음부터?해야한다)
로 교체하지 않은 이는 각 컨텍스트가 다른 트랜잭션을 의미하기 때문에 발생합니다. TransactionScope에 중첩시켜야합니다. – Fals
Fals : 우리의 entite는 느리게로드됩니다. 즉, 프로그램에서 언제든지 데이터베이스에서 항목을 가져 오는 동안 속성을 호출 할 수 있습니다. 그 동안 데이터베이스 값은 이미 스레드와 같이 다른 컨텍스트 인스턴스에 의해 변경 될 수 있습니다. – Olaf
지연로드는 문제와 관련이 없습니다. 아직 커밋되지 않은 것을 업데이트하기 위해 두 개의 다른 컨텍스트를 호출하고 있습니다. 그게 문제 야. 다음과 같이 TransactionScope를 사용해야합니다. http://msdn.microsoft.com/en-us/data/dn456843 – Fals