C# 实体框架4-如何更新对象

C# 实体框架4-如何更新对象,c#,entity-framework,entity-framework-4,C#,Entity Framework,Entity Framework 4,net 4和c# 我有一个对象(myContentObj)和一个导航属性(CmsGroupsTypes) 我需要更新特定objct的导航属性。 目前,我使用下面的代码删除当前关联并添加新关联,以便更新导航属性 虽然我的代码可以工作,但我想知道您是否知道更好的方法。。。我不确定EF4中是否存在更新方法或类似方法 谢谢你的帮助 // Remove object myContentObj.CmsGroupsTypes.Remove(myCurrentGr

net 4和c#

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

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

目前,我使用下面的代码删除当前关联并添加新关联,以便更新导航属性

虽然我的代码可以工作,但我想知道您是否知道更好的方法。。。我不确定EF4中是否存在更新方法或类似方法

谢谢你的帮助

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

对此我不是很确定,我现在无法检查,但我认为您可以直接更改 myCurrentGroupTypeObj属性,然后执行以下操作:

ObjectStateManager.ChangeObjectState(myCurrentGroupTypeObj , EntityState.Modified);

我希望它能起作用。如果没有,请告诉我。

上下文跟踪您的对象,只需从上下文获取它,更改其数据和上下文。SaveChanges()

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

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

另一种方法是使用外部关联,其中依赖实体还提供外键属性。只需将此属性设置为父项的id,即可更改关系。这仅适用于一对一和一对多关系


请注意,从父实体的导航属性中删除实体不会从数据库中删除子实体。因此,如果与父项的关系是依赖的,您也必须将其删除,否则
SaveChanges
会引发异常。

也许我的问题会对您有所帮助:谢谢您的评论,您对Jonathan的方法有何看法?这取决于您配置的关系类型。它可能在一对多的情况下起作用,但我认为它不会在多对多的情况下起作用。