如何使用Entity Framework仅搜索Store而不搜索本地数据?

时间:2011-11-16 02:20:26

标签: c# entity-framework-4

我正在使用EF 4.1并仍在尝试找出一些细节。我在数据库中有一个父(一) - 孩子(很多)关系。表示该子对象的EF对象具有表示父对象的属性。我显式设置了child.parentId FK字段然后我可以做一个context.Add(child),然后是一个context.SaveChanges()和带有正确父外键的子记录显示在数据库中。就db而言,一切都很好。

但是,当内存子对象使用PK标识列等内容正确更新时,父属性字段保持为空。我对此感到惊讶,这是正常的吗?创建记录后,我回到应用程序,导航到父级始终有效。只是看起来在创建子项之后,父导航属性不会更新。

我想也许我可以根据返回的PK搜索我刚刚创建的子项的上下文,并获取一个完全填充的子对象,但它不起作用。我似乎只是找回了一个相同的对象。我认为它只是搜索本地缓存并返回我已有的对象。我注意到context.Child.Local似乎是一种只查看本地视图的方法,但我没有看到“商店”对应物。

3 个答案:

答案 0 :(得分:2)

您应该设置导航属性(&对象参考)的值,而不是设置键的值。例如

Child child = GetChildFromSomewhere();
Parent parent = GetParentFromSomewhere();

// Don't do this
child.ParentId = parent.ParentId;

// Use this instead
child.Parent = parent;

您不需要直接触摸按键。当您更改此类关联时,密钥将在适当的时候更新。

如果直接更改密钥,则不会自动更新对象引用(上下文不会找到相应的Parent并添加引用,直到您保存或重新同步数据库)。

如果更改对象,则会在需要时更新密钥。但同样,你不应该直接提到钥匙。 EF适用于对象关系,而不是键 - 键连接。

答案 1 :(得分:1)

在创建新的Context之前,将无法正确设置PK。您应该在每个SaveChange()之后处置并重新创建上下文。

答案 2 :(得分:1)

您是否尝试将子对象直接添加到父对象的子EntityCollection而不是Context ObjectSet?这也将它添加到Context ObjectSet中,因此您可以避免问题开始。