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

时间:2015-03-31 07:44:41

标签: c# entity-framework entity-framework-6 dbcontext change-tracking

据我所知,如果我在上下文中更改条目的状态,那么:

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

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

的方式
  

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

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

当然,我可以迭代遍历所有图形并明确设置状态,但是存在更简单的方法吗?

2 个答案:

答案 0 :(得分:1)

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

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

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

enter image description here

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

答案 1 :(得分:0)

您可以查看GraphDiff

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

  

假设您的公司有很多联系人。联系人不是   单独定义并且是一对多(具有所需父级)记录   一家公司即该公司是Aggregate Root。假设你有   一个独立的公司图表,其附加的联系人和想要   反映数据库中该图的状态。

     

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

     

好消息是经过一些重构后,我找到了解决这个问题的好办法。