2009-12-10 2 views
0

WPF 응용 프로그램 (.NET 3.5SP1)을 개발 중입니다. 이 시나리오는 다음과 같습니다.WPF 응용 프로그램의 LINQ to SQL 업데이트 문제

1. SQL Metal을 사용하여 나중에 데이터 액세스 계층에 사용 된 엔티티 정의 (및 해당 맵 파일)를 추출합니다 (LINQ to SQL을 사용함). 클래스 이름은 - 유니티를 2.using

등등 추상 클래스와 해당 구현 (예 IRepository 및 ActualRepository, IDataContext 및 ActualContext, IUnitOfWork 및 ActualUnitOfWork 등을 ... 등록 (이 응용 프로그램은 "PRISM 기반"입니다) 실제 크기는 아니지만 여기서는 중요하지 않음)

3. ViewModel 및보기를 만들 때 MVMVM 스타일이 사용됩니다.

삽입 및 삭제 괜찮 았는데 ... 그러나 나는이 이상한 행동을 발견 :

A) 새 레코드를 생성하고 사용자가 한 번만 (신규) 레코드를 저장 할 수 있었다 일부 필드를 작성하여! ! 사용자가 일부 데이터를 다른 필드에 삽입하는 것을 잊어 버렸고이 레코드를 다시 저장하려고 시도한 경우 (변경 사항)이 변경 사항은 dbms에 반영되지 않았습니다.

그래서 사용자가 응용 프로그램을 닫고 응용 프로그램을 다시 연 다음 이전에 삽입 한 레코드를로드했습니다. 이제 :이 레코드에 대한 모든 변경 사항이 실제로 dbms에 반영되었습니다! (:

public SQLDataContext(string connectionString) 
     { 
      dc = new DataContext(connectionString, Mapping.GetMapping()); 
     } 

이 방법으로 만들어진)

나는 약간의 인터넷 검색을했고, 분리 된 객체에 관한 몇 가지 문제를 발견

나는 그것이 데이터 컨텍스트에 문제가 될 수있다 생각했다. 나는 이것이 나의 상황과 관련이있다라고 확신하지 않고 있었다. 그러나 그것이해야했던 것을 이해했던 약간의 blogs를 읽는 것!

길고 짧은 이야기 : 내 테이블에 타임 스탬프 필드를 사용한다고 생각했습니다.

b) 상기 언급 한 바와 같이, 새로 생성 된 기록은 최초 저장 후 한번 이상 저장 될 수있다. 응용 프로그램을 닫았다가 다시 열어도 문제가 없습니다.

하지만 새로운 문제가 발생했습니다.

하나의보기에서 일부 콤보 상자가 사용됩니다. 이러한 combobox에 바인드 된 필드는 실제이 레코드가 실제 레코드 인 한 올바르게 업데이트됩니다. 우리가 다음 레코드로 이동할 때 이전 레코드는 null로 할당 된 해당 필드 (콤보 박스에 바인딩 됨)를 가져옵니다 !!!! 나는 이것이 바인딩 문제라고 생각하고 아무런 결과없이 콤보 박스에 양방향 바인딩 모드를 명시 적으로 배치했습니다.

이것은 나를 미치게 만든다. (상황에서) 나는 이러한 문제가 발생하지 않았다 !!!!)

예상대로 텍스트 필드에 바인딩 된 필드가 작동합니다! 본인 : 바인딩 오류가 없습니다.

그래서 누군가가 상황 a)이 이렇게 행동하는 이유를 설명해 주시겠습니까? 왜 b) WPF 콤보 박스에 바인딩 된 필드가 다음과 같이 작동합니까? 사전

답변

0

당신이 저장 한 후 선택하는 SQL 상황에 LINQ를 재사용하는 경우에

덕분에, 그렇게하지 않습니다.

가장 좋은 방법에 대한 새로운 컨텍스트를 만들려면 삽입/업데이트/삭제에 싸여 사용 :

using(var dc = new DataContext()) 
{ 
    // Delete/Change/Insert some objects 

    dc.SaveChanges(); 
} 

+0

이 문제는 이에 바인딩 (재) 또 다른 새로운 DataContext 인스턴스를 생성 이 방법으로 Datacontext를 만듭니다. using (IUnitOfWork unitOfWork = UnitOfWork.Begin()) { unitOfWork.Commit(); } 및 UnitOfWork.Begin()이 방법으로 정의된다 이 공공 정적 IUnitOfWork)() ( { 반환 ServiceLocator.Current.GetInstance 시작을; } 나는 위에서 언급 한 것처럼 화합을 사용하고 있습니다. 그래서 제가 두려워하는 것은 Unity가 항상 같은 컨텍스트를 반환한다는 것입니다 !! –

+0

저장 및 반입에 별도의 작업 단위를 사용합니까? –

+0

내 문제에 대한 해결책을 찾은 것 같아요. a) 시간 소인 필드가 제거되었습니다. b) 레코드 저장시 UnitOfWork.Begin() 이후에 확인이 필요합니다. if (newRecord) {add (object)} else {새로 고침 (object)}; commitWork(); 희망이 수정되었습니다. 그러나 나는 아직도 comboboxes와 함께이 이슈를 가지고있다!! –