2011-04-14 6 views
0

나는 다음과 같은 방법을 사용하여 MVC 웹 응용 프로그램이 (때로는) 업데이트하지 않음 :LINQ는

public class MyController : Controller 
{ 
    public FooRepository fooRepository = new FooRepository(); 
    public BarRepository barRepository = new BarRepository(); 

    public ActionResult UpdateItems(int id, int range1, int range2) 
    {  
     Foo foo = fooRepository.GetItem(id); 
     List<Bar> bars = barRepository.GetItemsByRange(range1, range2); 

     // Some validation rules here... 

     DoSomeWork(foo, bars); 

     // Show confirmation/error message 
    } 

    private void DoSomeWork(Foo foo, List<Bar> bars) 
    { 
     foreach(int i = 0; i < bars.Count; i++) 
     { 
      bars[i].Prop1 = foo.Prop1; // This field is updated 
      bars[i].Owner = "someuser"; // This one too 
      bars[i].Status = BarStatus.SomeStatus; // This isn't... 
     } 
     foo.Status = FooStatus.SomeStatus; // Ok 

     // Calls DataContext.SubmitChanges() 
     fooRepository.SubmitChanges(); 
     barRepository.SubmitChanges();  
    } 
} 

그러나 일부 "임의"가지 경우 (내가 어떤 패턴을 참조), 하나 의견에 언급 된대로 필드의 업데이트되지 않습니다.

LINQ가 필드의 업데이트를 인식하지 못하는 것 같아 생성 된 쿼리에서 제외됩니다.

아무에게도 내가 뭔가를 놓치고 있다고 말할 수 있습니까? 그 원인이 무엇일 수 있으며 어떻게 해결할 수 있습니까?

참고 : 예외가 발생하지 않으며 개발 시나리오에서이 사례를 확인할 수 없습니다.

+0

실제 코드를 복사하여 붙여 넣을 수 있습니까? –

답변

0

오류가 임의적이며 개발 과정에서 사용자의 오류보다 재현 할 수없는 경우 내 경험에 의하면.

.net 프레임 워크 또는 CLR이 일을 다르게하기로 결정한 경우 프로그래밍이 정말 어려울 것입니다.

+0

글쎄, 나는 그것을 말하고 싶지만, 실제로 이것이 언제 생겼는지 지켜보고 있었다. 내가 알고 싶은 것은 LINQ에 대한 특별한 것이 있다면 여기에 알지도 모르는 ... – Meryovi

+0

그리고 결국, 내가 거기에 없었을 때 사용자가했던 것은 ... – Meryovi

+0

어머! – jfar

0

당신은 아마 주위에 떠있는 곳

[Bind(Exclude="...,Status,...")] 

그냥 물론 Linq에 이 상태는, 이미 그때는하지 않습니다 BarStatus.SomeStatus 것을 생각

+0

그 중 하나를 확인했으나 찾을 수 없습니다. 이 업데이트는 해당 사례의 97 % 근처에서 성공하므로 제외 대상이 아니라고 생각합니다. 어쨌든 고마워! – Meryovi

0

경우 추측 암시 적/명시 적 바인드 제외가 그것을 업데이트하십시오.

상태가이 값으로 설정된 레코드를 찾은 다음 다른 루틴에서이 값을 변경하면 동일한 DataContext를 사용하는 경우 캐시 된 복사본에서 이전 값을 가져옵니다 Linq는 그것을 업데이트 할 필요가 없다고 생각합니다.

+0

그럴 수 있다고 생각했지만 "barRepository.GetItemsByRange"메서드는 Status <> BarStatus.SomeStatus 인 행을 이미 선택합니다. 상태는이 작업에서만 변경되며 주어진 "막대"집합을 업데이트 할 수있는 사용자는 한 명입니다. 이것은 나를 미치게합니다! – Meryovi

+0

그런 경우 루프에서 [bars] [Status]! = BarStatus.SomeStatus 막대를 명시 적으로 검사하여 오류를 기록하거나 예외가 발생하면 예외를 throw합니다. 이 문제의 원인을 찾는 데 도움이되지 않을 수도 있지만 가능한 원인으로 간주해야합니다. – sgmoore

+0

좋은 조언. 또한 BarStatus의 유형은 무엇입니까? 우리는 그것이 enum 타입이 될 것으로 기대하고 있지만 정적 멤버 'SomeStatus'를 가진 클래스 타입이 될 수도 있습니다. – sehe