2011-03-23 80 views
0

net 4和c#。实体框架4 - 如何更新对象

我有一个对象(myContentObj)和一个导航属性(CmsGroupsTypes)。

我需要更新特定对象的导航属性。

此刻我使用下面的代码删除当前关联并添加一个新的,所以我可以更新导航属性。

虽然我的代码有效,但我想知道是否知道更好的方法...我不确定在EF4中是否存在UPDATE方法或类似方法。

感谢您的帮助!

  // Remove object 
      myContentObj.CmsGroupsTypes.Remove(myCurrentGroupTypeObj); 
      // Update object 
      myContentObj.CmsGroupsTypes.Add(myNewGroupTypeObj); 
      context.SaveChanges(); 
+0

也许我的问题会帮助你一点点:http://stackoverflow.com/questions/4131868/is-there-an-update-object-holder-on-entity-framework – balexandre 2011-03-23 11:42:17

回答

1

这是正确的做法。您正在修改导航属性=您正在修改实体之间的关系。要删除实体之间的关系,您必须从导航属性中删除相关的实体。要添加实体之间的关系,您必须将相关实体添加到导航属性。

唯一的问题是,如果您使用存在于数据库中的实体调用Add,但它未从数据库(虚拟对象或分离实体)加载。在这种情况下,EF将尝试再次将您的实体插入数据库。为避免这种情况,您必须使用附加实体(从数据库加载它)或将其状态设置为Unchanged

其他方式是使用外国协会,其中依赖实体也提供外键属性。您只需将此属性设置为父级的ID即可更改关系。这仅适用于一对一和一对多的关系。

请注意,从父级的导航属性中删除实体并不会从数据库中删除实体的子实体。所以如果与父母的关系是依赖的,你也必须删除它或者SaveChanges引发异常。

+0

感谢您的评论,做什么你想想乔纳森的方法? – GibboK 2011-03-23 13:01:04

+0

这取决于你配置什么类型的关系。它可能在一对多的情况下工作,但我认为它不适用于多对多。 – 2011-03-23 13:22:01

+0

我明白了再次感谢! – GibboK 2011-03-23 14:18:54

0

我真的不知道这一点,我不能检查它的权利,但我认为你可以直接改变 myCurrentGroupTypeObj属性,然后做

ObjectStateManager.ChangeObjectState(myCurrentGroupTypeObj , EntityState.Modified); 

希望有用。如果没有,请让我知道。

1

语境保持跟踪你的对象,从上下文中只得到它,改变它的数据和Context.SaveChanges()