2011-04-26 110 views
1

這應該很簡單:如果我有一個實體框架主細節關係,我該如何在代碼中添加細節記錄?比方說,我有一個名爲Book的父表/實體和一個名爲Chapter的子/查找表/實體,其中包含一個ChapterTitle字段/屬性。我希望用戶能夠將ChapterTitles輸入到TextBox中,然後單擊「添加章節標題」按鈕。新的ChapterTitle將出現在通過CollectionViewSource綁定到Chapters表/實體的ListView中。主要細節:如何添加詳細記錄?

我不使用MVVM(並且我不尋求涉及MVVM的答案)。我正在使用數據源窗口中的拖放操作,如this Julie Lerman post中所述。在我的情況的區別是,而不是通過數據網格顯示和添加詳細信息我使用ListView和文本框爲用戶添加新章節標題。

拖放設立了兩個CollectionViewSource條目在XAML:

<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) 

那真是所有有給它。創建該對象,將其添加到上下文中,並將其添加到Master的詳細信息集合中。在上面的例子中,在Context.AddObject方法中,「章節」是指您要添加到上下文的類的EntitySet的名稱。

CollectionViewSource將其源代碼設置爲Books Chapter集合,應該選擇添加該章節,並且應該使用新元素更新UI。通常,除了更改視圖(過濾,排序等)時,您不必與CollectionViewSource進行交互。

+0

哈利路亞......它終於奏效了!我添加了這個:_booksListCollectionView =(ListCollectionView)_booksCollectionViewSource.View; Book MyBook =(Book)_factSheetsListCollectionView.CurrentItem; 獲取當前父記錄。有沒有更好的辦法?另外,有人可以解釋爲什麼新的子實體需要添加到父導航屬性(MyBook.Chapters)和子實體集?我認爲將其添加到導航屬性會自動將其添加到子實體集。感謝Cory。 StackOverflow岩石! – DeveloperDan 2011-04-27 14:38:11

+0

將子記錄添加到Book對象中的Chapters集合中僅添加對書中章節的引用。你真正擁有的是一個實體,與上下文無關,它說它屬於本書。爲了EF追蹤它的變化並在其上執行數據庫功能,它必須被添加到上下文中。你可以創建一個方法將其添加到上下文中,並一舉將其分配給父項,但這並不是什麼大事。我通常首先添加到上下文中,然後添加到父項。而且,這是一種在沒有MVVM的情況下獲得當前流程的很好方法。 – CodeWarrior 2011-04-27 14:42:30

0

我可能完全不瞭解問題,但通常需要創建一個新的子對象並將其分配給父項的子項列表。保存父項時,應保存新的子對象。 或者您可以分配新的子對象的父項並保存它。

+0

從概念上我明白需要做什麼,但我還沒有想出(我們找到一個例子)幾行代碼,在我描述的上下文中添加了一個新的細節記錄。 – DeveloperDan 2011-04-26 22:00:00