programing

WPF 데이터 바인딩과 함께 Entity Framework를 사용하는 모범 사례

elecom 2023. 4. 28. 20:11
반응형

WPF 데이터 바인딩과 함께 Entity Framework를 사용하는 모범 사례

저는 제 첫 번째 실제 WPF 애플리케이션(즉, 제가 아닌 다른 사람이 사용하기 위한 첫 번째 애플리케이션)을 구축하는 중이며, 여전히 WPF에서 가장 좋은 방법을 찾고 있습니다.새로운 Entity Framework를 사용하는 매우 간단한 데이터 액세스 애플리케이션이지만, 이 두 기술(WPF 및 EF)을 함께 사용하는 가장 좋은 방법에 대한 지침을 온라인에서 많이 찾지 못했습니다.그래서 저는 제가 접근하는 방법을 버리고 더 나은 제안이 있는지 알아보려고 했습니다.

  • SQL Server 2008에서 Entity Framework를 사용하고 있습니다.EF는 필요한 것보다 훨씬 더 복잡하고 아직 성숙하지 않다는 인상을 주지만, Linq-to-SQL은 분명히 사망했기 때문에 MS가 집중하고 있는 것처럼 보이는 기술을 사용하는 것이 나을 수도 있습니다.

  • 이 애플리케이션은 단순한 애플리케이션이기 때문에 별도의 데이터 계층을 구축하기에 적합한 것으로 보지 못했습니다.데이터를 얻고자 할 때, 저는 상당히 간단한 Linq-to-Entity 쿼리를 사용합니다. 보통 코드백에서 직접 쿼리합니다. 예를 들어 다음과 같습니다.

    var families = from family in entities.Family.Include("Person")
               orderby family.PrimaryLastName, family.Tag
               select family;
    
  • Linkq-to-Entity 쿼리는 기본 데이터의 변경 사항을 자동으로 반영하지 않는 IOrderQueryable 결과를 반환합니다. 예를 들어 코드를 통해 새 레코드를 엔티티 데이터 모델에 추가하면 이 새 레코드의 존재가 Linkq 쿼리를 참조하는 다양한 컨트롤에 자동으로 반영되지 않습니다.따라서 기본 데이터 변경 사항을 캡처하기 위해 이러한 쿼리 결과를 관찰 가능한 컬렉션에 넣습니다.

    familyOC = new ObservableCollection<Family>(families.ToList());
    
  • 그런 다음 관찰 가능한 컬렉션을 컬렉션 뷰에 매핑합니다.데이터베이스로 돌아가지 않고 필터링, 정렬 등을 수행할 수 있는 소스입니다.

    familyCVS.Source = familyOC;
    familyCVS.View.Filter = new Predicate<object>(ApplyFamilyFilter);
    familyCVS.View.SortDescriptions.Add(new System.ComponentModel.SortDescription("PrimaryLastName", System.ComponentModel.ListSortDirection.Ascending));
    familyCVS.View.SortDescriptions.Add(new System.ComponentModel.SortDescription("Tag", System.ComponentModel.ListSortDirection.Ascending));
    
  • 그런 다음 다양한 컨트롤 및 기타 기능을 해당 컬렉션 보기에 바인딩합니다.출처:

    <ListBox DockPanel.Dock="Bottom" Margin="5,5,5,5" 
        Name="familyList" 
        ItemsSource="{Binding Source={StaticResource familyCVS}, Path=., Mode=TwoWay}" 
        IsSynchronizedWithCurrentItem="True" 
        ItemTemplate="{StaticResource familyTemplate}" 
        SelectionChanged="familyList_SelectionChanged" />
    
  • 레코드/개체를 추가하거나 삭제해야 할 경우 엔티티 데이터 모델과 관찰 가능한 컬렉션 모두에서 수동으로 추가합니다.

    private void DeletePerson(Person person)
    {
        entities.DeleteObject(person);
        entities.SaveChanges();
        personOC.Remove(person);
    }
    
  • 일반적으로 StackPanel 및 DockPanel 컨트롤을 사용하여 요소를 배치합니다.그리드를 사용할 때도 있지만 유지하기가 쉽지 않습니다. 그리드의 맨 위에 새 행을 추가하려면 그리드에서 직접 호스트하는 모든 컨트롤을 눌러 새 라인을 사용하라는 메시지를 표시해야 합니다.으악. (Microsoft는 DRY 개념을 실제로 이해한 적이 없는 것 같습니다.

  • VS WPF 디자이너를 사용하여 컨트롤을 추가, 수정 또는 배치하는 일은 거의 없습니다.VS와 함께 제공되는 WPF 디자이너는 양식이 어떤 모습일지 확인하는 데 다소 도움이 되지만, 특히 설계 시점에 사용할 수 있는 데이터에 바인딩되지 않는 데이터 템플릿을 사용하는 경우에는 그렇지 않습니다.XAML을 수정해야 할 경우에는 남자답게 수동으로 수정합니다.

  • 제 실제 코드의 대부분은 XAML이 아닌 C#으로 되어 있습니다. 제가 아직 "생각"하는 것에 익숙하지 않다는 사실을 제외하고는, XAML은 제게 투박하고 추악한 언어로 다가옵니다. 디자이너와 지식인의 지원도 부족하지만 디버깅할 수 없습니다.으악. 결과적으로, XAML에서는 쉽게 볼 수 없는 C# 코드백에서 어떤 일을 하는 방법을 명확하게 볼 수 있을 때마다, 나는 사과 없이 C#에서 그것을 합니다.WPF 페이지(예: 이벤트 처리를 위해)에서 코드백을 거의 사용하지 않는 것이 얼마나 좋은 관행인지에 대해 많이 쓰여 왔지만, 적어도 지금까지는 그것이 전혀 말이 되지 않습니다.제가 세계적인 편집자, 거의 완벽한 지능, 그리고 비길 데 없는 유형의 안전을 가진 C#처럼 멋지고 깨끗한 언어를 사용할 수 있는데 왜 제가 신통치 않은 구문을 가진 추악하고 투박한 언어로 무언가를 해야 합니까?

그래서 제가 있는 곳입니다.좋은 의견이라도 있나?제가 이 일의 중요한 부분을 놓치고 있나요?다르게 하는 것에 대해 정말로 생각해야 할 것이 있습니까?

WPF 문제를 EF와 분리하기 위해 저장소 패턴을 구현해야 합니다.

그런 다음 제네릭을 사용하여 EF to CollectionView의 복잡성을 줄일 수 있습니다.소스 처리

잘 설계된 저장소는 코드 레벨을 줄이고 ORM을 대체할 수 있어야 합니다(적절한 테스트에 필요).

이에 대한 몇 가지 아이디어가 여기에 있습니다.

http://blog.nicktown.info/2008/12/10/using-a-collectionviewsource-to-display-a-sorted-entitycollection.aspx

또한 여기서 ToList()를 할 필요가 없다고 생각합니다.ObservableCollection()은 패밀리가 이미 있는 IE 번호를 사용합니다.ToList를 수행하고 이를 Observable Collection에 전달하면 모든 레코드를 두 번 반복할 수 있습니다.

familyOC = new ObservableCollection<Family>(families.ToList());

대신, 이 방법을 사용해 보십시오. 이 방법은 좀 더 빨라야 합니다.

familyOC = new ObservableCollection<Family>(families);

무슨 말을 하는지 이해해.Josh Smith의 이 기사는 WPF를 이상하고, 방해적이며, 디버깅하기 어렵고, 비우호적인 프레임워크로 보는 대신 WPF의 이점을 얻을 수 있도록 제가 사고방식을 바꾸도록 도와주었습니다.

가능하면 인터페이스 설계에 코드비하인드 대신 Expression Blend를 사용하여 Visual Studio 디자이너를 사용하는 대신 시간을 많이 절약하는 것이 좋습니다.또한 xaml 대신 C#을 사용하여 다시 생각해 보십시오.만약 당신이 "WPF 방식"을 한다면 Xaml은 그렇게 못생기지 않습니다.종종 xaml 대신에 뒤에 있는 코드를 사용하는 것이 더 쉽다고 생각할 때, 그것은 내가 잘못된 방식으로 그것을 하고 있기 때문이고 WPF/xaml과 어떻게 가장 잘 작동해야 하는지 다시 생각해봐야 할 필요합니다.당신이 그것에 익숙해지면, Xaml은 좋습니다.저는 아직 너무 훌륭하지 않은 엔티티 프레임워크도 사용했습니다.저는 NHN을 선호합니다.

저는 제 블로그에서 이 링크를 팔로우했고 EF에서 발견한 다른 것을 언급하고 싶었습니다.주제가 좀 틀리긴 하지만, 완전히는 아닙니다.

사용 시 EF와 관련된 몇 가지 미친 성능 문제를 발견했습니다.포함하다.MS는 그들의 웹사이트에 있는 기사에서 그 이유를 설명하기 때문에 저는 실제로 대부분의 코드를 사용하도록 바꾸기 시작했습니다.대신 로드 방법.

귀찮은 일이고 다른 방법을 찾지 못했기 때문에...저는 "IncludeByRoundTrip"이라는 저만의 방법을 만들었습니다.개체 경로를 사용하여 전체 경로가 로드되도록 합니다.최종 결과는 include를 사용할 때와 동일하지만 뒤에서 객체 그래프의 모든 속성에 Load를 호출합니다.

그것은 주문과 같은 것을 하는 것과 비슷할 것입니다.로드("고객").주소")를 입력합니다.어느 쪽이든, 제 블로그에서 확인하시고 결과를 알려주세요.다른 사람들이 Include를 사용하여 속도 저하를 눈치챘는지, 그리고 상황을 공격하는 다른 접근법이 있는지 궁금합니다.

제 솔루션에 대한 자세한 내용은 http://blog.nicktown.info/2009/07/27/method-to-load-an-entire-object-graph-using-adonet-entity-framework.aspx 을 참조하십시오.

다시 한 번 말씀드리지만 주제에서 벗어나서 죄송합니다만, 답변을 기다리겠습니다.

다른 도구는 바인딩 가능할 수 있습니다.LINQ

바인딩 가능한 LINQ는 표준 LINQ 쿼리에 데이터 바인딩 및 변경 전파 기능을 추가하는 LINQ에 대한 확장 집합입니다.

언급URL : https://stackoverflow.com/questions/628437/best-practices-for-using-the-entity-framework-with-wpf-databinding

반응형