C# 如何链接添加到DbSet的实体 免责声明

C# 如何链接添加到DbSet的实体 免责声明,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我不想刷新数据库中的任何内容。 我要寻找的答案应该在上下文和内存中找到。 摘要 我面临着一个奇怪的EF行为(我认为这不是一个实际的bug),似乎“相同”的概念操作在两种不同的方式下工作,这取决于前提条件。 幸运的是,该案例简单且重复性好。 该模型由一对相关表组成;当我将一个表直接添加到其上下文的dbset中时(关系的哪一边无关紧要),如果该对中的另一个表是“已加载”的,有时会建立两个表之间的链接,有时则不建立,这取决于另一个表(上下文已经知道的表)是“Read_from_DB”还是“Added”

我不想刷新数据库中的任何内容。
我要寻找的答案应该在上下文和内存中找到。

摘要 我面临着一个奇怪的EF行为(我认为这不是一个实际的bug),似乎“相同”的概念操作在两种不同的方式下工作,这取决于前提条件。
幸运的是,该案例简单且重复性好。
该模型由一对相关表组成;当我将一个表直接添加到其上下文的dbset中时(关系的哪一边无关紧要),如果该对中的另一个表是“已加载”的,有时会建立两个表之间的链接,有时则不建立,这取决于另一个表(上下文已经知道的表)是“Read_from_DB”还是“Added”

我试图通过以下两种场景更好地描述问题:

数据库模型 DB模型是一个简单的主/细节模型:

  • T\u家长
    (带有
    集合
  • T_儿童
    (带
    参考
  • 情景1
  • DB中,我们有:
    • T_父母中有1行
      ,键为“xyz”
    • T_子项中有0行
  • c#中,我们使用以下内容加载所有数据:
    • ctx.T_PARENTS.ToList()(已加载1行)
    • ctx.T_CHILDREN.ToList()(已加载0行)
    • var existing_parent=ctx.T_PARENTS.First()
  • 此时,
    existing_parent
    有一个包含0行的
    T_子项的集合
  • c#中,我们添加了一个新的
    T#u CHILDREN
    ,其中包括:
    • var new_child=new T_CHILDREN(){parent_key=“xyz”}
    • ctx.T_CHILDREN.Add(新_child)
  • 在这里,上下文发挥了它的魔力,在对象
    现有的\u父对象
    中,我们可以找到
    集合
    现在有一行(刚刚添加的行)
  • 情景2
  • DB中,我们有:
    • T\u父母中的0行
    • T_子项中有0行
  • c#中,我们使用以下内容加载所有数据:
    • ctx.T_PARENTS.ToList()(已加载0行)
    • ctx.T_CHILDREN.ToList()(已加载0行)
  • c#中,我们添加了一个新的
    T#u家长
    ,其中包括:
    • var new_parent=new T_PARENTS(){key=“xyz”}
    • ctx.T\u PARENTS.Add(新的\u PARENTS)
  • c#中,我们添加了一个新的
    T#u CHILDREN
    ,其中包括:
    • var new_child=new T_CHILDREN(){parent_key=“xyz”}
    • ctx.T_CHILDREN.Add(新_child)
  • 在这里,上下文没有产生任何魔力,对象
    新的\u父对象
    仍然具有0行的
    集合(我们找不到新的\u子对象刚刚添加到上下文中)
  • 问题是:
    • 为什么?
    • 是否有任何函数可针对上下文调用以“刷新”附加到上下文的所有实体的集合和引用?(…否,
      ctx.ChangeTracker.DetectChanges()
      不起作用:-)
    再次感谢各位

    mM

    这都是关于实体状态和上下文的。这里使用的最重要的方法是返回的将为您提供

    在第一个场景中,
    现有的\u父对象
    已经是一个跟踪对象,在第二个场景中,它很可能被分离,直到您
    保存更改
    ,或者显式地将
    EntityEntry
    状态设置为
    EntityState。添加了


    关于原因的更多信息:在第二个场景中,您向集合添加了一个对象,但实际上并没有告诉上下文本身对其进行任何处理。通过设置
    EntityEntry
    上的信息,可以明确地告诉上下文“跟踪此对象”

    我找到了一个可行的解决方法(但这不是我想要的答案)<代码>var objCtxDelivery=((IObjectContextAdapter)ctxDelivery).ObjectContext
    objCtxDelivery.AcceptAllChanges()嗨,埃里斯,首先感谢理论上的澄清!无论如何,即使在第二个场景中,我也使用
    ctx.T\u PARENTS.add(new\u parent)添加
    new\u parent