2010-05-20 2 views
7

Entity Framework (.NET 3.5)를 사용하는 WPF 응용 프로그램을 개발하는 중입니다. 그것은 여러 곳에있는 엔티티에 액세스합니다. 엔티티와 관련하여 애플리케이션 전반에 걸쳐 일관성이 우려됩니다. 내 다른 견해에서 별도의 컨텍스트를 인스턴스화해야합니까, 아니면 전 세계적으로 액세스 할 수있는 단일 컨텍스트를 사용해야합니까 (그리고이 작업을 수행하는 좋은 방법입니까?).WPF 응용 프로그램의 전역 엔터티 프레임 워크 컨텍스트

예를 들어, 내 엔티티 모델에는 출하 (하위 패키지 및 추가 하위 컨텐츠 포함), 회사/연락처 (하위 주소 및 전화 사용) 및 디스크 스펙의 세 섹션이 있습니다. Shipments 및 EditShipment보기는 DiskSpec에 액세스하고 OptionsView는 DiskSpecs (작성, 편집, 삭제)를 관리합니다. DiskSpec을 편집하는 경우 별도의 컨텍스트가있는 경우 ShipmentsView에서 최신 사양을 검색해야합니다.

앱의 나머지 부분이 객체를 가져 오는 전체적인 컨텍스트를 갖는 것이 안전하다면 이동하는 것이 바람직하다고 생각합니다. 그렇다면 그 인스턴스는 어디에 놓이게 될까요? VB.NET을 사용하고 있지만 C#에서 변환 할 수 있습니다. 어떤 도움을 주시면 감사하겠습니다.

나는 단지 사용자가 새로운 데이터를 얻기 위해 앱의 다른 부분에서 12 번 다시로드해야하는 애플리케이션 중 하나를 원하지 않습니다.

  1. 모든 상황이 더 이상 필요 후 폐기하지 않으려면 블록을 사용하여 만들어집니다

    는 업데이트 : 다음과 같이

    확인 그래서 난 내 응용 프로그램을 변경했습니다.

  2. 로드되면 모든 항목이 삭제되기 전에 모든 항목이 컨텍스트에서 분리됩니다.
  3. MainViewModel (ContextUpdated)의 새 속성은 해당 ViewModels RefreshEntities 메서드를 실행하는 다른 모든 ViewModel에 가입하는 이벤트를 발생시킵니다.
  4. 이것을 구현 한 후에 엔티티는 한 번에 하나의 ChangeTracker에 의해서만 참조 될 수 있다는 오류가 발생하기 시작했습니다. 어떤 컨텍스트가 여전히 엔티티를 참조하고 있는지 파악할 수 없으므로 (컨텍스트가 올바르지 않아야합니까?) IEntityWithChangeTracker로 객체를 캐스팅하고 SetChangeTracker를 nothing (Null)로 설정합니다.

이 현재 문제에하자있다 : 나는 엔티티에 changeTracker을 NULL, 다음 상황에 첨부 할 때,이 상태가 바뀌 잃고 데이터베이스에 업데이트되지 않습니다 . 그러나 변경 추적기를 null로 설정하지 않으면 첨부 할 수 없습니다. 내 자신의 변경 추적 코드가 있으므로 문제가되지 않습니다.

내 새로운 질문은 어떻게해야할까요? 좋은 예 엔티티 질의와 엔티티 저장 코드가 잘려나 간다면 먼 길을 갈 것입니다. 왜냐하면 제가 생각하기에 단순히 일할 단순한 트랜잭션을 얻으려고 노력하고 있기 때문입니다.

+0

당신이 downvote면, 나는 설명을 좋아할 것입니다. 적어도 그것은 길 아래로 더 이상하지 말아야 할 일을 알려 줄 것입니다. – CodeWarrior

답변

5

전역 정적 컨텍스트는 거의 올바른 대답이 아닙니다. 이 응용 프로그램을 실행하는 동안 데이터베이스가 재설정되면 SQL 연결이 끊어지고 정적 컨텍스트를 사용하는 모든 후속 요청이 실패하는 경우를 생각해보십시오. , ..., 폐기, 몇 가지 작업을 수행 엽니

지금까지 같은 EDMX에 다른 개체를 퍼팅 -

당신이 당신의 엔티티 컨텍스트 훨씬 짧은 수명을 가질 수있는 방법을 찾을 추천 같은 EDMX에서 원하는 객체간에 관계가 있다면 거의 확실한 답이 될 것입니다.

다시로드하는 경우 - 사용자가이 작업을 수행 할 필요가 없습니다. 백그라운드에서 새로운 컨텍스트를 열어 데이터베이스에서 현재 버전의 개체를 다시로드하고 UI에서 변경 한 내용을 적용한 다음 다시 저장할 수 있습니다.

분리 된 엔티티도 볼 수 있으며 변경 사항을 저장하려고 할 때 다른 누군가가 데이터베이스에서 동일한 오브젝트를 변경하면 낙관적 인 동시성 예외를주의해야 할 수 있습니다.

+0

여러 문맥을 사용하고 있다면, 문맥이 끌어 낸 데이터를 새로 고치는 법을 알게 될 것입니다. 나는 다른 컨텍스트에 의해 설정된 propertychanged 이벤트를 모니터링 할 수 있습니까? – CodeWarrior

+0

응용 프로그램이 유휴 상태 일 때 컨텍스트를 닫고 사라져야합니다. 당신이 가지고있는 것은이 상태에있는 DTO 또는 파생 된 개체뿐입니다. 사용자가 단일 컨텍스트를 열 때 뭔가를 클릭하면 엔티티를 다시 첨부하거나 다시로드하고 UI에서 변경 내용을 적용한 다음 낙관적 인 동시성 예외를 처리 한 savechanges를 호출 한 다음 뷰를 업데이트하고 마지막으로 컨텍스트를 삭제합니다. 컨텍스트를 하나의 작업 단위로 묶는 것으로 생각하십시오. –

+0

이것은 EF 기능을 보는 방식의 근본적인 변화를 나타냅니다. 나는 컨텍스트가 뷰 모델이 그것을 처분 할 때까지 (뷰가 처리 될 때까지) 데이터로 생성 한 객체에 대한 참조를 보유 할 것으로 예상된다는 인상 아래에있었습니다. 현재 사용자 정의 컬렉션에로드되어보기에 표시되는 EF를 통해 Shipment 객체를로드하는 ViewModels이 있습니다. 메모리 오브젝트를 변경 한 후에는 변경 사항 저장을 호출하고 동일한 컨텍스트 (right?)를 사용하여 서버를 업데이트합니다. 올바르지 않은 경우 변경 사항을 저장하면 다르게 작동합니까? – CodeWarrior

3

좋은 질문입니다. 내게 엄지 손가락을 올려라.

Entity Framework는 자유로운 선택을 제공합니다. 여러 컨텍스트를 인스턴스화하거나 하나만 정적으로 설정할 수 있습니다. 두 경우 모두에서 잘 작동 할 것이며, 두 솔루션 모두 안전합니다. 내가 줄 수있는 유일한 가치있는 조언은 두 가지 실험, 실적 측정, 지연 등이며 가장 적합한 것을 선택하는 것입니다.그것은 재미, 나를 믿어 :

이것은 동시 연결의 톤과 함께 정말 거대한 응용 프로그램이 될 경우 하나의 정적 컨텍스트 또는 하나의 정적, 핵심 컨텍스트 및 단지 몇 가지 추가 것들을 그냥 메인 하나를 지원하는 것이 좋습니다 . 하지만, 위의 몇 줄을 썼기 때문에 어느 솔루션이 더 나은지에 대한 요구 사항에 달려 있습니다.

난 그냥 사용자가 얻을 수있는 응용 프로그램의 다른 부분에 수십 번 다시로드 을 명중하는 그 응용 프로그램 중 하나를 원하지 않는다 :

나는 특히 당신의 질문의이 부분을 좋아했다 새로운 데이터.

WPF는 정말 강력한 도구이며 기본적으로 사용자가 데이터를 새로 고치기 위해 단추를 눌러야 영원히 사라집니다. WPF는 백그라운드에서 원하는 데이터를 부드럽게 새로 고치기 위해 Dispatcher 클래스 나 Background worker와 같은 매우 다양한 비동기, 멀티 스레딩 도구를 제공합니다. 다양한 버튼을 누르는 것에 대해 걱정할 필요가 없으며 배경 스레드가 UI를 차단하지 않으므로 데이터가 사용자의 관점에서 투명하게 새로 고쳐지기 때문에 이것은 정말 좋습니다.

WPF는 Entity Framework와 함께 배우는 데 정말로 가치가 있습니다. 추가 문제가 있으면 언제든지 물어보십시오.

+0

Piotr, Hightechrider와 대화를 참조하십시오. 나는 본질적으로 WPF와 EF를 가르친다. 내 첫 번째 앱은 꽤 못 생겼고 멍청했지만, 내가 갈수록 더 세련되게되었습니다. ViewModel 기능을 관리하기위한 훌륭한 리소스는 훌륭합니다. 검색 할 때 많은 결과가 표시되지만 대부분은 MVVM 등의 일반적인 설명입니다. – CodeWarrior

+0

안녕하세요, imo 초보자를위한 최고의 MVVM 기사는 다음과 같습니다. http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx 이것은 가능한 한 간단하여 많은 정보를 제공합니다. . 귀하의 진행 상황을보고하십시오 : –

+0

그 기사는 Entity Framework에 관한 것이 아닙니다. MVVM 및 TreeView 컨트롤에 대한 것입니다. – CodeWarrior

관련 문제