如何链接添加到DbSet的实体

时间:2015-09-21 16:58:08

标签: c# entity-framework entity-framework-6

声明

我没有尝试刷新任何FROM或TO数据库 我正在寻找的答案应该在内存中找到。

摘要

我面临一种奇怪的EF行为(我认为它不是一个真正的错误),它似乎是"相同"概念操作根据前提条件以两种不同的方式工作 幸运的是,案例简单且可重复 该模型包含一对相关表格;当我将一个表直接添加到其上下文的DbSets时(如果该对的哪一方并不重要),如果该对中的另一个表已经加载了#34;有时两者之间的联系是建立的,有时不是,它取决于另一个表(上下文已经知道的表)是" Read_from_DB"或者"添加"。

我尝试用2场景更好地描述问题:

DB MODEL

数据库模型是一个简单的主/详细信息:

  1. T_PARENTS (使用Collection<T_CHILDREN>
  2. T_CHILDREN (使用Reference<T_PARENTS>
  3. SCENARIO 1

    1. 数据库中,我们有:
      • T_PARENTS中的一行,带有键&#34; xyz&#34;
      • T_CHILDREN
      • 中的0行
    2. c#中,我们使用以下命令加载所有数据:
      • ctx.T_PARENTS.ToList();(已加载1行)
      • ctx.T_CHILDREN.ToList();(已加载0行)
      • var existing_parent = ctx.T_PARENTS.First();
    3. 此时existing_parent的{​​{1}}集合为0行。
    4. c#中,我们添加了一个新的T_CHILDREN
      • T_CHILDREN
      • var new_child = new T_CHILDREN() {parent_key = "xyz"};
    5. 此处上下文变得神奇,在对象 ctx.T_CHILDREN.Add(new_child); 中,我们现在可以找到 existing_parent 1行(刚添加的行)。
    6. SCENARIO 2

      1. 数据库中,我们有:
        • Collection<T_CHILDREN>
        • 中的0行
        • T_PARENTS
        • 中的0行
      2. c#中,我们使用以下命令加载所有数据:
        • T_CHILDREN(已加载0行)
        • ctx.T_PARENTS.ToList();(已加载0行)
      3. c#中,我们添加了一个新的ctx.T_CHILDREN.ToList();
        • T_PARENTS
        • var new_parent = new T_PARENTS() {key = "xyz"};
      4. c#中,我们添加了一个新的ctx.T_PARENTS.Add(new_parent);
        • T_CHILDREN
        • var new_child = new T_CHILDREN() {parent_key = "xyz"};
      5. 此处上下文没有任何魔法,对象 ctx.T_CHILDREN.Add(new_child); 仍然具有 new_parent 有0行(我们无法找到刚添加到上下文中的new_children)。
      6. 问题是:

        • 为什么?
        • 是否有任何函数可以调用Context来&#34;刷新&#34;收藏品&amp;附加到上下文的所有实体的引用? ...和否,Collection<T_CHILDREN>不起作用: - )

        再次感谢你们! 毫

1 个答案:

答案 0 :(得分:0)

这完全是关于具有上下文的实体状态。这里使用的最重要的方法是DbContext.Entry(object)返回的EntityEntry将为您提供EntityState

在第一种情况下,$this->zipClass->addFile('templates/document.xml', 'word/document.xml'); 已经是被跟踪的对象,在第二种情况下,它很可能已被分离,直到您existing_parent或明确设置SaveChangesState转到EntityEntry

更多关于为什么:在第二个场景中,您将一个对象添加到集合中,但实际上并没有告诉上下文本身对它做任何事情。通过在EntityState.Added上设置信息,您明确告诉上下文&#34;跟踪此对象&#34;