2014-06-20 2 views
0

엔티티의 네비게이션 속성이 끝났다는 생각이 들지 않는 응용 프로그램에서 매우 이상한 문제가 발생했습니다. 엔티티가 실제로있을 때 다른쪽에 있습니다. 네비게이션 속성은 일대일 탐색이며 과거에는 일대일 속성에 다른 문제가 있었음을 알고 있습니다. 따라서 이상한 케이스 버그를 만났을 수도 있습니다.다중 캐시 복원/가져 오기 후 Dev Force Navigation 등록 정보의 문제

가장 단순한 방법으로 문제를 재현하려고 시도하면서 entityManager.CacheStateManager.RestoreCacheState (someCacheState)를 두 번 연속 수행하여이를 재현 할 수 있음을 발견했습니다. 두 번하면 문제가 발생하지만 한 번 만 수행하면 문제가 발생합니다. 우리의 응용 프로그램에서는 캐시 상태를 복원하는 중이고 문제와 관련된 것으로 보입니다. 나는 우리가 그것을 두 번이나 복원하고 있다고 생각하지 않는다. 어느 쪽이든, 이렇게하는 것이 좋을 것 같습니다.

또한 실제 응용 프로그램에서는 두 엔터티 (일대일 관계에 참여하는 두 엔터티) 목록에서 ImportEntities를 수행하여 두 번의 두 가지 문제를 재현 할 수 있습니다. 이 경우 문제를 재현하기 위해 동일한 캐시 상태를 두 번 복원해야한다는 이상한 일을 할 필요가 없습니다. 가져 오기를 두 번만 수행하면됩니다. 불행히도, 나는 깨끗한 솔루션으로 이중 가져 오기를 재현 할 수 없었습니다.

private static void TestMultipleImports() 
{ 
    //Any database with a one-to-one should work. I'm using Adventure Works here but I've modified 
    // it to have a one-to-one relationship. For each Contact there are 0 or 1 Contact Details 
    // (they both have ContactID as the Primary Key) 
    var mainEm = new AdventureWorksEntities(); 

    //Add a Contact and a Contact Detail with the same SID 
    var contact = new Contact {ContactID = 1}; 
    var detail = new ContactDetail {ContactID = 1}; 

    mainEm.AttachEntity(contact); 
    mainEm.AttachEntity(detail); 

    //DevForce correctly matched up the entities so navigating from Contact to Detail or 
    // from Detail to Contact works as expected 
    Assert.AreSame(detail, contact.ContactDetail); 
    Assert.AreSame(contact, detail.Contact); 

    //In another entity manager, add the same Contact and Details 
    var altEm = new AdventureWorksEntities(); 
    altEm.AttachEntity(new ContactDetail {ContactID = 1}); 
    altEm.AttachEntity(new Contact {ContactID = 1}); 

    //Use our helper method to import everything from our alternate EM into the main one 
    ImportAll(altEm, mainEm); 

    //Verify the navigations are still working 
    Assert.AreSame(contact, detail.Contact); 
    Assert.AreSame(detail, contact.ContactDetail); 

    //Now do a similar import except we'll import into the dummy EM before importing into the main EM. 
    // This 'double import' seems to cause the problem. It would also break if we imported twice into 
    // main EM. 
    var dummy = new EntityManager(); 
    ImportAll(altEm, dummy, mainEm, mainEm); 

    //Verify once more. This one will pass ... 
    Assert.AreSame(contact, detail.Contact); 

    //...but this will fail. The Contact Detail is in the Entity Manager and it can navigate to its related 
    // Contact...but for some reason, the Contact can't navigate to the Detail any longer. Instead of 
    // being the expected Contact Detail entity, it is a Null Entity 
    Assert.AreSame(detail, contact.ContactDetail); 
} 

//Perhaps a bit of an odd way to copy entities between entity managers but it seems like this should be a 
// reasonable thing to do 
private static void ImportAll(EntityManager source, params EntityManager[] destinations) 
{ 
    var ecs1 = source.CacheStateManager.GetCacheState(); 

    foreach (var destination in destinations) 
    { 
     destination.CacheStateManager.RestoreCacheState(ecs1, RestoreStrategy.Normal); 
    } 
} 

우리는 데브 포스 2012 버전 (이 글을 쓰는 현재) 최신 실행 : 7.2.3 여기

몇 가지 샘플 코드 (가) ​​예상 동작을 보여 실제 동작을 보여주고있다.

+0

죄송합니다. 귀하가 DF 2010 또는 2012 중 어느 것을 사용하고 있는지 기억이 없습니다. –

+0

해당 정보를 포함해야합니다. 질문을 업데이트했지만 우리는 DF2012에 있습니다 - 7.2.3. –

+1

AW2000에서 Employee-SalesPerson 1 : 1 관계로 이것을 재현 할 수 없으며 RestoreCacheState 및 ImportEntities 둘 다에서 올바른 동작을 볼 수 없습니다. 아마도 문제는 모델에서 관계가 정의되는 방법에 있습니다. Contact-ContactDetail 엔터티에 EDMX를 게시 (또는 보내주십시오) 하시겠습니까? 또한 CloningFns.CloningMethod를 설정 했습니까? –

답변

1

여기서 근본적인 문제는 DevForce가 1 : 1 관계에서 "확인되지 않은 부모"엔티티라고 부르는 방식과 관련하여 문제가되는 것으로 나타났습니다. EntityCacheState의 여러 가져 오기/변경 문제는 주로 청어이지만 문제를 노출 시켰습니다.

이 문제는 버전 7.2.4에서 수정되었습니다.

+0

이것을 확인할 수 있습니다. 7.2.4로 업그레이드하면 문제가 해결되었습니다. –

0

우리는이 문제를 해결할 수 있다고 생각하지만 가능한 경우 응용 프로그램에서 문제를 해결할 수있는 베타 비트를 얻고 자합니다. 알려 주시면 ftp 사이트 패키지를 압축합니다.

문제는 EntityCacheState가 실제로 사용할 때마다 변경되어 일부 이상한 가장자리 조건이 발생할 수 있다는 것입니다. 테스트 경우

, 당신이 중 하나를 사용하여 좋은 결과를 알 수 있습니다 다음

  • 같은에서 altEm 엔티티를 부착하는 경우는 ImportAll
  • 에서 foreach 루프 내에서 새로운 ECS를 만들 경우 주문이 mainEm에서 이루어진 것처럼

실제 앱의 문제는 테스트 케이스와 다소 다르지만 7.2.4가 출시 될 때까지 해결 방법으로 코드를 약간 조정할 수 있습니다.

+0

문제는 실제 앱에서 재현하기가 쉽기 때문에 베타 버전을 테스트하고 어떻게 진행되는지 알려주고 싶습니다. 제안 된 해결 방법을 보내 주셔서 감사합니다. 그것은 매우 도움이됩니다. –

+0

Zip의 이름은 FTP 사이트에서 DF7.2.4.zip입니다. URL이 필요한 경우 저에게 연락하십시오. –

+0

나는 고마워, 고마워. 그것은 내 간단한 샘플 응용 프로그램에서 문제를 해결하지만 불행히도, 그것은 우리의 실제 응용 프로그램에서 문제를 해결하지 않습니다! :-(문제를 재현하려고 시도 할 수는 있지만 어떻게 성공적 일지 확신하지 못합니다. 실제 앱에서는 ECS를 두 번 사용하지 않는다고 생각합니다. 서버에서 부분적으로 가져옵니다. RPC 호출을 한 번 복원하십시오 (생각합니다). ECS 복원과 관련된 다른 잠재적 문제가 있습니까? –