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_儿童
(带参考
)
,键为“xyz”T_父母中有1行
T_子项中有0行
ctx.T_PARENTS.ToList()代码>(已加载1行)
ctx.T_CHILDREN.ToList()代码>(已加载0行)
var existing_parent=ctx.T_PARENTS.First()代码>
existing_parent
有一个包含0行的T_子项的集合
T#u CHILDREN
,其中包括:
var new_child=new T_CHILDREN(){parent_key=“xyz”}代码>
ctx.T_CHILDREN.Add(新_child)代码>
现有的\u父对象
中,我们可以找到集合
现在有一行(刚刚添加的行)T\u父母中的0行
T_子项中有0行
ctx.T_PARENTS.ToList()代码>(已加载0行)
ctx.T_CHILDREN.ToList()代码>(已加载0行)
T#u家长
,其中包括:
var new_parent=new T_PARENTS(){key=“xyz”}代码>
ctx.T\u PARENTS.Add(新的\u PARENTS)代码>
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
此函数会自动将状态设置为“已添加”,并使上下文知道此实体,因此原因应该不同。