gpt4 book ai didi

entity-framework - 代码优先 - 当我没有将父对象设置为 EntityState.Modified 时,如何保存 ICollection?

转载 作者:行者123 更新时间:2023-11-30 23:49:19 28 4
gpt4 key购买 nike

如果我有以下类(class):

public class Foo()
{
public int PropertyIWantUpdated {get; set;}
public int PropertyIDontWantUpdated (get; set}

public ICollection<Bar> Bars {get; set;}
}

保存到我的数据库时,而不是
context.Entry(thisFoo).State = EntityState.Modified;

我正在使用
context.Entry(thisFood).Property(tf => tf.PropertyIWantUpdated).IsModified = true;

我怎样才能保存对 Bars 的更改?

最佳答案

这取决于您要更新的内容。首先让我澄清一个重要的事实——如果你已经分离了实体图(更多具有关系的实体)并且你想将所有更改传递给 EF,你有责任告诉 EF 在每个实体和每个关系中发生了什么变化——EF 不会帮你解决。

如果您只想更新 Bar实例并且您没有更改关系(=您没有将新的 Bar 添加到 Foo 或从 Bar 中删除 Foo )您只需要迭代 Bars并将它们设置为 Modified状态。

如果您还更改了 Bars 的内容收集整个过程变得非常复杂,方法取决于您定义实体的方式 = 如果您使用 independent or foreign key association .

在外键关联的情况下( Bar 有 FK 作为属性 = 在 Bar 你有类似 FooId 的东西)你遵循与开始类似的方法。你迭代 Bars并将状态设置为:

  • Modified如果现有 Bar已分配给 Foo
  • Added如果是新的 Bar已分配给 Foo

  • 有一个大问题。如果你删除了一些 Bar来自 Bars 的实例集合,您还必须将它们附加到上下文并相应地设置它们的状态:
  • Modified如果 FK 应设置为 null
  • Deleted如果 Bar应该删除

  • 这一切仅适用于一对多关系。

    如果您认为以前的方法很复杂,请准备好在独立关联的情况下( Bar 没有 FK 属性 - 对于多对多关系总是如此),过程更糟。独立协会有自己的对象跟踪状态=在 Bar上设置状态实体不持久化新关系。第一个问题是这个对象不能直接从 DbContext API 访问——你必须转换 DbContextObjectContext并使用 ObjectStateManager访问 ObjectStateEntry表示关系。之后你必须正确设置它的状态,这并不像看起来那么容易,因为关系不能在 Modified 中。状态 - 它只能在 Unchanged , AddedDeleted .这意味着如果您将 Bar 的关系从一种更改为另一种 Foo您必须首先找到旧关系并将其设置为已删除,然后才能将新关系设置为添加。如果您有多对多关系,并且您还想添加、删除和更新相关对象(不仅是关系),这真的很“有趣”——尤其是您必须在某处保留已更改的信息这一事实能够正确设置所有状态。

    关于这个问题的更多讨论(EF 中的全局)是 here - 它与 DbContext API 无关,但因为新 API 只是旧 ObjectContext API 的包装器,所以仍然存在相同的问题。

    你觉得可行吗?我不这么认为。因此,您应该尽量避免这种情况。有一些方法可以避免它:
  • 对附加的对象图进行更改 - 这意味着您将首先将实体图的原始状态附加到上下文,然后您将进行所有更改。
  • 加载原始对象图并手动合并从新图到加载(和附加)的所有更改。
  • 在 ObjectContext API 的情况下,您可以使用 Self-tracking entities它能够跟踪状态并自动设置应用于上下文的所有内容。他们还有其他一些 disadvantages和限制(例如它们不支持延迟加载)并且它们不适用于 DbContext API。
  • 关于entity-framework - 代码优先 - 当我没有将父对象设置为 EntityState.Modified 时,如何保存 ICollection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6239502/

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