【发布时间】:2020-04-22 13:51:03
【问题描述】:
我正在尝试编写一个 UpdateStatus 方法,它只会在我将更改保存到数据库时更新实体的状态字段。如果实体中的任何其他字段已更改,我不想将这些更改保存到数据库中。这对于实体自己的字段来说已经足够简单了,使用:
using (var context = new DataAccessContext())
{
context.Attach(entity);
context.Entry(entity).Property(e => e.StatusCode).IsModified = true;
context.SaveChanges();
}
但是,我发现如果该相关实体没有设置键值,则任何可通过我正在设置其状态的实体的导航属性访问的相关实体都将被插入。因此,如果某个调用代码向entity.Children 添加了一个新的 Child 实体,并且 Child 实体的 ChildId 属性为 0,则该 Child 将被插入到数据库中。
在 EF Core 中是否有任何简单的方法可以避免插入相关实体?
我发现了一篇旧的 StackOverflow 帖子,它展示了如何在 pre-Core Entity Framework 中执行此操作:How do I stop Entity Framework from trying to save/insert child objects? 但是,该答案涉及遍历每个相关实体。 EF Core 中是否有更简单的方法?
我正在寻找一种更简单的方法的原因是我的实体层次结构有 5 层深。而且我发现仅分离实体的直接子级是不够的。您必须使用嵌套循环来分离孙子、曾孙等。如果您只分离直接的孩子,他们不会被插入,但 EF Core 会尝试插入新的孙子,并且会崩溃和烧毁,因为它没有插入他们的父母。它变得非常混乱。
我可以在更新其状态之前从数据库中读取实体的新副本,但我试图避免在写入之前必须进行读取。
【问题讨论】:
-
你可以尝试清空相关数据而不是分离它。
-
@Dennis1679:谢谢。那成功了。如果你愿意这样回答,我会接受。
-
很高兴我能帮上忙!我会回答的。
标签: entity-framework entity-framework-core