【发布时间】:2012-02-23 06:32:32
【问题描述】:
我遇到了实体关联刷新问题。当我得到这样的实体时:
MyContext context = new MyContext();
Person myPerson = context.PersonSet.FirstOrDefault();
String myPersonName = myPerson.Name;
Address myPersonAddress = myPerson.Address;
我有一个人,他有一个名为 Address 的关联和一个名为 Name 的属性。如果我手动修改数据库中的数据,例如属性名称,我必须使用以下代码重新加载我的实体:
context.Entry(myPerson).Reload();
我有了新的 Name 值。但如果我对地址做同样的事情,它就行不通了。我认为这是因为 Address 是一个关联属性。我需要刷新它。
如何强制重新加载 Address 关联(以及 Person 类中的所有其他关联)?
编辑:
在同样的情况下,一个人可以拥有多个地址。
MyContext context = new MyContext();
Person myPerson = context.PersonSet.FirstOrDefault();
String myPersonName = myPerson.Name;
List<Address> myPersonAddresses = myPerson.Addresses;
在这种情况下,它不是参考:
context.Entry(myPerson).Reference(p => p.Address).Load();
// Address will be populated with only the new address
// this isn't required because I use lazy loading
但是一个集合:
context.Entry(myPerson).Collection(p => p.Addresses).Load();
// Address will be populated with old value and new value
我需要用这个来工作:
context.Entry(myPerson).Collection(p => p.Addresses).CurrentValue.Clear();
context.Entry(myPerson).Collection(p => p.Addresses).Load();
但对我的所有导航属性执行此操作似乎不是一个好的解决方案!
【问题讨论】:
-
你的意思是
context.Entry(myPersonAddress).Reload()不有效吗? -
是的,这意味着它不起作用。因为这个方法只重新加载属性(=Name)而不是关联(=Address)
-
啊,对不起,我误会了。因此,您不想重新加载同一
Address实体的标量属性,而是重新加载与可能另一个Address实体的关系。嗯,好问题…… -
Person是否具有用于Address导航属性的公开外键属性? -
如何公开外键属性?你的意思是 ?我的 .csdl 中有一个导航属性
标签: c# entity-framework ado.net entity-framework-4.1