据我所知,如果我在上下文中更改条目的状态,那么:
context.Entry(doc).State = EntityState.Added;
doc
后面的整个对象图将设置为EntityState.Added
。这就是这种机制描述here:
请注意,对于所有这些示例,如果要添加的实体具有 引用尚未跟踪的其他实体然后是这些新实体 实体也将被添加到上下文中并将被插入 下次调用SaveChanges时数据库。
在我的情况下,这种行为是不可取的。当我收到doc
实体时,它的关系已经在数据库中(在不同的上下文中添加),再次添加它们会导致错误。我需要将doc
添加到包含所有引用的数据库中,但不要尝试在图中添加其他对象。
当然,我可以迭代遍历所有图形并明确设置状态,但是存在更简单的方法吗?
答案 0 :(得分:1)
在Entity Framework Core中,行为发生了变化,调用:
context.Entry(asset).State = EntityState.Added;
只会影响实体,不会影响相关实体。
?我知道问题是针对实体框架经典(不是Core),但肯定会有更多使用EF Core的人来到这里(和我一样)?
答案 1 :(得分:0)
您可以查看GraphDiff
根据这个dedicated blog entry,它似乎符合您的需求:
假设您的公司有很多联系人。联系人不是 单独定义并且是一对多(具有所需父级)记录 一家公司即该公司是Aggregate Root。假设你有 一个独立的公司图表,其附加的联系人和想要 反映数据库中该图的状态。
目前使用实体框架,您需要执行 手动更新联系人,检查每个联系人是否是新的和 添加,检查是否更新并编辑,检查是否已删除然后将其删除 数据库。一旦你必须为几个不同的聚合做这个 在一个大型系统中,你开始意识到必须有更好,更多 通用方式。
好消息是经过一些重构后,我找到了解决这个问题的好办法。