2011-04-26 1 views
1

이것은 간단해야합니다 : 엔티티 프레임 워크 마스터 세부 관계가있는 경우 어떻게 코드에 세부 레코드를 추가합니까? Book이라는 부모 테이블/엔티티와 ChapterTitle 필드/속성을 포함하는 chapter라는 하위/룩업 테이블/엔티티가 있다고 가정 해 보겠습니다. 사용자가 TextBox에 ChapterTitles를 입력 한 다음 "장 제목 추가"버튼을 클릭 할 수있게하려고합니다. 그러면 새 장 제목이 CollectionViewSource를 통해 Chapters 테이블/엔티티에 바인딩 된 ListView에 나타납니다.마스터 세부 사항 : 세부 레코드는 어떻게 추가합니까?

MVVM을 사용하고 있지 않습니다. MVVM과 관련된 답변을 찾고 있지 않습니다. this Julie Lerman post에서 설명한대로 데이터 소스 창에서 드래그 앤 드롭을 사용하고 있습니다. 제 경우의 차이점은 DataGrid를 통해 세부 정보를 표시하고 추가하는 대신 ListView와 텍스트 상자를 사용하여 사용자가 새 장 제목을 추가한다는 것입니다.

드래그 앤 드롭은 XAML에서 두 CollectionViewSource 항목을 만들었습니다 :

<Window.Resources> 
    <CollectionViewSource x:Key="booksViewSource" d:DesignSource="{d:DesignInstance my:Book, CreateList=True}" /> 
    <CollectionViewSource x:Key="bookChaptersViewSource" Source="{Binding Path=ChaptersNav, Source={StaticResource booksViewSource}}" /> 
</Window.Resources> 

자동 생성 된 코드는 다음과 같습니다

private System.Data.Objects.ObjectQuery<Book> GetBooksQuery(BookEntities bookEntities) 
    { 
     // Auto generated code 
     System.Data.Objects.ObjectQuery<BookNamespace.Book> booksQuery = bookEntities.Books; 
     // Update the query to include Chapters data in Books. You can modify this code as needed. 
     booksQuery = booksQuery.Include("Chapters"); 
     // Returns an ObjectQuery. 
     return booksQuery; 
    } 

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     BookEntities bookEntities = BookEntities(); 
     // Load data into Books. You can modify this code as needed. 
     System.Windows.Data.CollectionViewSource booksViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("booksViewSource"))); 
     System.Data.Objects.ObjectQuery<BookNamespace.Book> booksQuery = this.GetBooksQuery(bookEntities); 
     booksViewSource.Source = booksQuery.Execute(System.Data.Objects.MergeOption.AppendOnly); 
    } 
내 button_click 이벤트에 추가 할 필요가 무엇 코드

텍스트 상자에서 사용자의 챕터 제목을 가져 와서 세부 정보의 CollectionViewSource (bookChaptersViewSource)를 통해 새로운 세부 레코드로 추가 할 수 있습니까? 나는 이것이 아주 간단 할 것으로 기대할 것이다. 그러나 나는 너무 많은 시간을 보냈지 만 어떤 행운을 보지 못했다. 미리 감사드립니다!

답변

0
VB 죄송

하지만 번역 정도로 쉬워야한다 :

정말로 거기에있다되어
Dim c as Chapter = New Chapter 
c.Title = ChapterTitleTextBox.Text 
context.AddObject(c, "Chapters") 
MyBook.Chapters.Add(c) 

. 객체를 생성하여 컨텍스트에 추가하고 마스터에 대한 상세 컬렉션에 추가합니다. 위의 예제에서 Context.AddObject 메서드에서 "Chapters"는 컨텍스트에 추가 할 클래스의 EntitySet 이름을 나타냅니다.

원본 컬렉션 장부를 장부 컬렉션으로 설정 한 CollectionViewSource는 장 추가를 선택해야하며 UI는 새 요소로 업데이트해야합니다. 일반적으로 View (필터, 정렬 등)를 변경할 때를 제외하고는 CollectionViewSource와 상호 작용할 필요가 없습니다.

+0

할렐루야 ... 마침내 작동합니다! 나는 이것을 추가했다 : _booksListCollectionView = (ListCollectionView) _booksCollectionViewSource.View; Book MyBook = (책) _factSheetsListCollectionView.CurrentItem; 을 사용하여 현재 상위 레코드를 가져옵니다. 더 좋은 방법이 있습니까? 또한 누군가가 부모 탐색 속성 (MyBook.Chapters)과 하위 엔터티 집합에 모두 새 자식 엔터티를 추가해야하는 이유를 설명 할 수 있습니까? 네비게이션 속성에 추가하면 자동으로 하위 엔티티 집합에 추가됩니다. 감사합니다 코리. StackOverflow 바위! – DeveloperDan

+0

Book 개체의 Chapters 컬렉션에 하위 레코드를 추가하면 장부에 대한 참조 만 추가됩니다. 당신이 실제로 가지고있는 것은 문맥에 붙어 있지 않은 실재물이며 책에 속한다고합니다. EF가 변경 사항을 추적하고 이에 대한 데이터베이스 기능을 수행하려면 컨텍스트에 추가해야합니다. 컨텍스트에 추가하고 부모에게 모두 할당하는 방법을 만들 수 있습니다. 급증 했습니다만, 그다지 큰 거래는 아닙니다.일반적으로 컨텍스트에 먼저 추가 한 다음 부모에 추가합니다. 또한 MVVM없이 최신 버전을 구할 수있는 좋은 방법입니다. – CodeWarrior

0

아마도이 문제를 완전히 이해하지는 못했지만 일반적으로 새 하위 개체를 만들어 부모의 자식 목록에 할당해야합니다. 부모를 저장하면 새 자식 객체를 저장해야합니다. 또는 새 하위 개체의 부모 ID를 할당하고 저장할 수 있습니다.

+0

개념적으로는 나는 일을해야하지만 (우리의 발견 예) 내가 설명한 컨텍스트 내에서 새로운 상세 레코드를 추가 코드 몇 줄을 생각하지 않은 것을 이해합니다. – DeveloperDan