【问题标题】: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 添加到包含所有引用的数据库中,但不要尝试在图中添加其他对象。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      你可以看看GraphDiff

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-18
        相关资源
        最近更新 更多