2011-04-26 66 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