如何添加没有相关实体但保存关系的实体?
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,它似乎符合您的需求:
假设您的公司有很多联系人。联系人不是 单独定义并且是一对多(需要父级)记录 一家公司。即公司是聚合根。假设你有 一个独立的公司图,附有联系人并希望 反映该图在数据库中的状态。
目前使用实体框架,您需要执行 手动更新联系人,检查每个联系人是否是新的和 添加,检查是否更新和编辑,检查是否删除然后删除 数据库。一旦您必须为几个不同的聚合执行此操作 在一个大系统中,你开始意识到必须有一个更好、更多 通用方式。
好消息是,经过几次重构后,我找到了解决这个问题的好方法。
【讨论】:
以上是关于如何添加没有相关实体但保存关系的实体?的主要内容,如果未能解决你的问题,请参考以下文章