【问题标题】:How should a one to many relationship be managed in Entity Framework?在实体框架中应该如何管理一对多关系?
【发布时间】:2014-05-14 15:45:56
【问题描述】:

我无法从根本上理解如何在实体框架中管理一对多关系。在我的应用程序中,我有两个表,DISPLAY_MASTERDISPLAY_ITEMS。他们的关系是这样的:

DISPLAY_MASTER.DISPLAY_ID 1----->* DISPLAY_ITEMS.DISPLAY_ID

Entity Framework 非常直观地组织了这一点。我留下了一个强类型 DISPLAY_MASTER 对象,它有一个名为 DISPLAY_ITEMSICollection 属性。

我的困惑在于如何将DISPLAY_ITEMS 集合保存回数据库。在我的应用程序中,我正在使用 LINQ 将特定 DISPLAY_MASTER 的所有 DISPLAY_ITEMS 读取到名为 _displayItemsList<DISPLAY_ITEMS> 对象中。然后将其绑定到 DataGrid 以使用 MVVM 进行编辑。用户可以编辑现有的DISPLAY_ITEMS,删除现有的DISPLAY_ITEMS,或使用DataGrid 添加新的DISPLAY_ITEMS。我的绑定工作完美,这些更改反映在_displayItems 中。一旦到了保存时间,我就不再对自己的代码充满信心了。当用户点击保存时,我正在设置DISPLAY_MASTERICollection,如下所示:

_displayMaster.DISPLAY_ITEMS = _displayItems;

这是处理实体框架集合的正确方法吗?还是应该将DataGrid 直接绑定到_displayMaster.DISPLAY_ITEMS 对象?还是别的什么方法?我不自信的原因是,如果我尝试使用以下方法验证 _displayMaster.DISPLAY_ITEMS 实体:

DbEntityValidationResult validationResults = _context.Entry(_displayMaster.DISPLAY_ITEMS).GetValidationResult();

我收到一条错误消息,提示“List1”不是集合的一部分,这显然不正确。

任何建议或指导将不胜感激。

谢谢。

【问题讨论】:

    标签: c# wpf entity-framework entity-framework-5 one-to-many


    【解决方案1】:

    视情况而定。

    • 如果在将实体绑定到网格时断开实体与其数据库上下文的连接(即,如果您在加载实体后处理上下文并在保存更改时创建新上下文),那么情况并非如此简单。您必须从数据库加载包含旧项目的主文件,根据您从网格中编辑的新集合将更改合并到该集合中,然后保存更改。如何做到这一点的一个例子是here

    • 1234563当您调用SaveChanges 时,正在对集合执行并将对象图自动更新到数据库中。

    由于您使用 WPF 标记了问题,您可能有第二个选项(取决于您的应用程序的体系结构)。例如,在 Web 应用程序中,第二个选项根本不存在,因为所有编辑都发生在浏览器中,而浏览器当然与上下文断开。

    【讨论】:

    • 我确实有第二个选项,但是我无法直接绑定到实体,因为它是ICollection 类型。当我去编辑DataGrid 中的记录时,我收到一条错误消息,提示“EditItem”不可用。我在这里错过了什么吗?
    • @user3043546:我建议您就这个后续问题提出一个单独的问题。这听起来更像是 WPF 绑定主题,而不是 EF 问题。我在这里帮不了你,我对 WPF 还不够熟悉。
    • 感谢您的反馈,您是对的。顺便说一句,我做了更多的研究,你的第二个解决方案是要走的路。
    猜你喜欢
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多