当前位置: 首页 > 知识库问答 >
问题:

实体框架核心是否有防止子实体或父实体更新的简单方法?

万涵亮
2023-03-14

我正在尝试编写一个Updatestatus方法,该方法仅在我保存对数据库的更改时更新实体的状态字段。如果实体中的任何其他字段发生了变化,我不想将这些更改保存到数据库中。对于实体自己的字段来说,这很简单,使用:

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

但是,我发现,如果相关实体没有键值集,则将插入通过我设置状态的实体的导航属性可访问的任何相关实体。因此,如果将新的子实体添加到实体中。子项,并且子实体ChildId属性为0,则该子项将插入到数据库中。

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

我发现了一篇旧的StackOverflow帖子,它展示了如何在预核心实体框架中执行此操作:如何阻止实体框架尝试保存/插入子对象?然而,这个答案涉及到每个相关实体的循环。EF Core有没有更简单的方法?

我之所以要寻找一种更简单的方法,是因为我的实体层次结构有5层之深。我发现仅仅分离实体的直系子实体是不够的。必须使用嵌套循环来分离孙子、曾孙等。如果只分离直系子代,则不会插入它们,但EF Core会尝试插入新孙子,并且会崩溃和烧坏,因为它没有插入它们的父代。它变得相当混乱。

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

共有2个答案

盖向荣
2023-03-14

实体框架核心会忽略关系,除非在查询中显式包含它们。

将实体附加到具有相关数据/子属性的数据库时,这些实体将包含在查询中。

因此,要解决此问题,您需要做的就是将这些子属性设置为null,然后EF Core将在您更新父对象时忽略子对象。

欧阳嘉年
2023-03-14

您的问题在EF Core中非常简单。如果不希望EF Core change tracker操作处理相关数据,请设置EntityEntry。声明而不是调用DbContext、Attach、Add、Update、Remove等方法。

此行为与EF6不同,EF6中的方法和设置状态是一样的,在“保存相关数据-添加新实体图”文档主题中有部分提到:

提示

使用EntityEntry。状态属性仅设置单个实体的状态。例如,上下文。条目(博客)。状态=EntityState。修改的

所以在你的样本中,简单地替换

context.Attach(entity);

具有

context.Entry(entity).State = EntityState.Unchanged;
 类似资料:
  • 实体框架5.0首先使用现有数据库编写代码。使用电动工具对类进行逆向工程。一切都很好。数据库有两个表。一个父母和一个孩子的外键返回到父母ID。ID都是带有自动增量的int。我添加了许多父母记录,现在想将孩子记录添加到特定的父母。我能看到的唯一方法是通过在父母表中搜索名称或其他属性并返回ID来找到适当的父母ID。然后在添加孩子时在外键属性中使用该ID。我不想设置新父母,所以这是将孩子添加到现有父母的唯

  • 我有一个简单的问题,但似乎找不到解决的办法。我使用的是EntityFramework核心版本2.0.1,希望在默认情况下加载所有实体。 示例: 但当我加载订单实体时,相关实体Customer及其内部地址为null 我所尝试的: 尝试升级到版本2.1并使用LazyLoadingProxies设置为false 这只是一个例子,我有多个嵌套级别的实体,我想在通用存储库中加载嵌套的相关数据,因此不能使用I

  • 我目前正在使用实体框架来建立一个论坛使用ASP。NET MVC I有3个主要模型[类别]1--*[论坛]1--*[帖子] 如果我有5个类别,每个类别有4个论坛,每个论坛有1000个帖子,我只想显示类别,当我这样做的时候,这意味着我也选择了20000个帖子?? 因为每个类别对象都有一个列表

  • 我在两个实体之间有双向或父/子关系: 我要选择没有的所有或的属性设置为的。 我使用的是。

  • 我有一个ASP MVC.NET核心(C#)项目,由于业务原因,SQL表不能有外键,因此,EF模型不映射关系(Entity.HasMany...)。 假设EF为实体生成一个模型,为生成一个模型。我想知道他们两个之间的关系。一个有多个并且一个属于一个。该任务在数据库中有项目Id(但请记住,它没有设置为FK)。 现在,我想通过to Entity获得一个项目列表,同时获得每个项目的任务列表。我通过创建一个

  • 问题内容: 我正在将子系统从 NHibernate 移植到 Entity Framework, 并希望看到将以下查询移植到 EF 的最佳方法。 帐户余额类别为: 该表是: 示例数据是(使用数字ID可以更好地理解): 该 AccountBalanceByDate 实体持有某一天的账户余额。如果某天没有交易,则该天将没有 AccountBalanceByDate ,我们应该查看前几天以查看该帐户的余额