gpt4 book ai didi

entity-framework - Entity Framework Core 是否有一种简单的方法来阻止子实体或父实体的更新?

转载 作者:行者123 更新时间:2023-12-02 19:44:25 25 4
gpt4 key购买 nike

我正在尝试编写一个 UpdateStatus 方法,当我将更改保存到数据库时,该方法只会更新实体的状态字段。如果实体中的任何其他字段已更改,我不想将这些更改保存到数据库中。这对于实体自己的字段来说非常简单,使用:

using (var context = new DataAccessContext())
{
context.Attach(entity);
context.Entry(entity).Property(e => e.StatusCode).IsModified = true;
context.SaveChanges();
}

但是,我发现,如果相关实体没有设置键值,则通过我设置其状态的实体的导航属性可访问的任何相关实体都将被插入。因此,如果通过某些调用代码将新的 Child 实体添加到 entity.Children 中,并且 Child 实体 ChildId 属性为 0,则该 Child 将被插入到数据库中。

EF Core 中有没有简单的方法可以避免插入相关实体?

我发现了一篇旧的 StackOverflow 帖子,其中展示了如何在核心 Entity Framework 之前执行此操作:How do I stop Entity Framework from trying to save/insert child objects?然而,这个答案涉及循环每个相关实体。 EF Core 有没有更简单的方法?

我正在寻找一种更简单的方法的原因是我的实体层次结构有 5 层深。我发现仅分离实体的直接子级是不够的。您必须使用嵌套循环来分离孙子、曾孙等。如果您只分离直接子代,它们将不会被插入,但 EF Core 将尝试插入新的孙子,并且会崩溃并烧毁,因为它还没有插入插入了他们的 parent 。它变得非常困惑。

我可以在更新其状态之前从数据库中读取实体的新副本,但我试图避免在写入之前进行读取。

最佳答案

您所问的问题在 EF Core 中非常简单。如果您不希望 EF Core 更改跟踪器操作处理相关数据,请设置 EntityEntry.State 而不是调用 DbContext/DbSet 方法如附加添加更新删除

此行为与 EF6 不同,其中方法和设置状态执行相同的操作,并在 Saving Related Data 中部分提及。 -Adding a graph of new entities文档主题:

Tip

Use the EntityEntry.State property to set the state of just a single entity. For example, context.Entry(blog).State = EntityState.Modified.

因此,在您的示例中,只需替换

context.Attach(entity);

context.Entry(entity).State = EntityState.Unchanged;

关于entity-framework - Entity Framework Core 是否有一种简单的方法来阻止子实体或父实体的更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59588050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com