2014-01-27 3 views
0

Null 허용 관계에 대해 NULL 값을 반환하는 Entity Framework가 있습니다. 우리는 먼저 모델을 연구합니다. 이 문제는 엔티티의 관계가 다른 컨텍스트 (또는 실제 사용 사례 인 다른 스레드)에서 변경되었을 때 발생합니다.
- 탐색 속성이 아직 호출되지 않은 경우 null을 반환합니다.
- 네비게이션 속성이 호출되기 전에 호출되었거나 엔티티에 외래 키 속성이 포함되어있는 경우 마지막 알려진 값을 반환합니다.Null 허용 탐색 속성이 Entity Framework에서 null입니다.

enter image description here :

  • 게으른 로딩은 내가 엔티티 프레임 워크 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) 엔티티는 예기치 않은 무언가가 우리 모두에서 우리의 코드에서 고려 (그리고 왜 처음부터?해야한다)

  • +0

    로 교체하지 않은 이는 각 컨텍스트가 다른 트랜잭션을 의미하기 때문에 발생합니다. TransactionScope에 중첩시켜야합니다. – Fals

    +0

    Fals : 우리의 entite는 느리게로드됩니다. 즉, 프로그램에서 언제든지 데이터베이스에서 항목을 가져 오는 동안 속성을 호출 할 수 있습니다. 그 동안 데이터베이스 값은 이미 스레드와 같이 다른 컨텍스트 인스턴스에 의해 변경 될 수 있습니다. – Olaf

    +1

    지연로드는 문제와 관련이 없습니다. 아직 커밋되지 않은 것을 업데이트하기 위해 두 개의 다른 컨텍스트를 호출하고 있습니다. 그게 문제 야. 다음과 같이 TransactionScope를 사용해야합니다. http://msdn.microsoft.com/en-us/data/dn456843 – Fals

    답변

    0

    context.DossierSet.Single(x => x.Id == ID); 
    

    context.DossierSet.Include(x => x.Fase).Single(x => x.Id == ID); 
    
    +1

    예를 들어 작동하지만 응용 프로그램에서 * 모든 * 관계에 대해 응용 프로그램에서 엔터티를 호출 할 때마다이 코드를 포함시켜야합니다. 이 문제의 핵심에 대해 서로 다른 접근법을 해결하거나 제공하지는 않습니다. Null을 허용 할 수없는 모든 엔터티는 null이 될 위험이 있습니다. – Olaf