【问题标题】:Master Details: How do I add a detail record?主明细:如何添加明细记录?
【发布时间】:2011-04-26 21:11:07
【问题描述】:

这应该很简单:如果我有一个实体框架主从关系,我如何在代码中添加一个明细记录?假设我有一个名为 Book 的父表/实体和一个名为 Chapter 的子表/查找表/实体,其中包含一个 ChapterTitle 字段/属性。我希望用户能够在文本框中键入章节标题,然后单击“添加章节标题”按钮。然后,新的 ChapterTitle 将出现在通过 CollectionViewSource 绑定到 Chapters 表/实体的 ListView 中。

我没有使用 MVVM(我也没有寻求涉及 MVVM 的答案)。我正在使用this Julie Lerman post 中所述的数据源窗口中的拖放操作。我的情况的不同之处在于,我不是通过数据网格显示和添加详细信息,而是使用 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) 将其添加为新的详细信息记录?我希望这很简单,但是我花了太多时间尝试却没有任何运气。提前致谢!

【问题讨论】:

    标签: wpf entity-framework binding collectionviewsource


    【解决方案1】:

    对不起 VB,但它应该很容易翻译:

    Dim c as Chapter = New Chapter
    c.Title = ChapterTitleTextBox.Text
    context.AddObject(c, "Chapters")
    MyBook.Chapters.Add(c)
    

    这就是它的全部内容。创建对象,将其添加到上下文中,将其添加到 Master 的详细信息集合中。在上面的示例中,在 Context.AddObject 方法中,“Chapters”指的是要添加到上下文中的类的 EntitySet 的名称。

    CollectionViewSource 的源设置为 Books Chapter 集合,应该选择添加的章节,并且应该使用新元素更新 UI。通常,您不必与 CollectionViewSource 交互,除非更改视图(过滤、排序等)。

    【讨论】:

    • 哈利路亚……终于成功了!我添加了这个:_booksListCollectionView = (ListCollectionView)_booksCollectionViewSource.View; Book MyBook = (Book)_factSheetsListCollectionView.CurrentItem;获取当前父记录。有没有更好的办法?另外,有人可以解释为什么需要将新的子实体添加到父导航属性(MyBook.Chapters)和子实体集?我假设将其添加到导航属性会自动将其添加到子实体集。谢谢科里。 StackOverflow 摇滚!
    • 将子记录添加到 Book 对象中的 Chapters 集合中只会添加对 Book 中章节的引用。你真正拥有的只是一个实体,与上下文无关,它说它属于这本书。要让 EF 跟踪其更改并对其执行数据库功能,必须将其添加到上下文中。您可以创建一个方法来将其添加到上下文中并一举将其分配给父级,但这并不是什么大不了的事。我通常先添加到上下文,然后添加到父级。此外,这是在没有 MVVM 的情况下获取最新信息的好方法。
    【解决方案2】:

    我可能没有完全理解这个问题,但通常您需要创建一个新的子对象并将其分配给父级的子级列表。当您保存父对象时,它应该保存新的子对象。 或者您可以分配新子对象的 parentid 并保存它。

    【讨论】:

    • 从概念上讲,我了解需要做什么,但我还没有弄清楚(我们找到了一个示例)在我描述的上下文中添加新详细记录的几行代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2021-08-31
    • 2019-07-11
    • 1970-01-01
    相关资源
    最近更新 更多