如何添加没有相关实体但保存关系的实体?

Posted

技术标签:

【中文标题】如何添加没有相关实体但保存关系的实体?【英文标题】:How to add an entity without related entities, but saving relation? 【发布时间】:2015-06-04 11:23:54 【问题描述】:

据我了解,如果我在这样的上下文中更改条目的状态:

context.Entry(doc).State = EntityState.Added;

doc 后面的整个对象图将设置为EntityState.Added。这就是这个机制如何描述here:

请注意,对于所有这些示例,如果要添加的实体具有 对尚未跟踪的其他实体的引用然后这些新的 实体也将被添加到上下文中,并将被插入到 下次调用 SaveChanges 时的数据库。

在我的情况下,这种行为是不可取的。当我收到doc 实体时,它的关系已经在数据库中(在不同的上下文中添加)并且再次添加它们会导致错误。我需要将doc 添加到包含所有引用的数据库中,但不要尝试在图中添加其他对象。

当然,我可以遍历所有图形并显式设置状态,但是否存在更简单的方法?

【问题讨论】:

【参考方案1】:

Entity Framework Core中,行为发生了变化,调用:

context.Entry(asset).State = EntityState.Added;

只会影响实体而不影响相关实体。

? 我知道问题是针对实体框架 classic(不是 Core),但肯定会有更多人使用 EF Core 到达这里(像我一样)?

【讨论】:

【参考方案2】:

你可以看看GraphDiff

根据这个dedicated blog entry,它似乎符合您的需求:

假设您的公司有很多联系人。联系人不是 单独定义并且是一对多(需要父级)记录 一家公司。即公司是聚合根。假设你有 一个独立的公司图,附有联系人并希望 反映该图在数据库中的状态。

目前使用实体框架,您需要执行 手动更新联系人,检查每个联系人是否是新的和 添加,检查是否更新和编辑,检查是否删除然后删除 数据库。一旦您必须为几个不同的聚合执行此操作 在一个大系统中,你开始意识到必须有一个更好、更多 通用方式。

好消息是,经过几次重构后,我找到了解决这个问题的好方法。

【讨论】:

以上是关于如何添加没有相关实体但保存关系的实体?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用外键保存实体而不在 JPA 中加载相关实体?

当我从未将实体添加到上下文时,实体框架错误地保存了它

相关实体的 iOS 核心数据持久性

在 Swift Core Data 中保存没有关系的实体

DDD如何保存实体之间的关系?

在 Symfony 中正确保存相关实体(外键)