2014-02-20 58 views
0

我在EF中有一个存储库,需要更新分离的实体,但存在于ObjectStateManager中的存储库。想象一下,您已经在DBContext上打开了一个会话,在该会话中加载了一个特定的实体,但是随后您会收到一个从分离版本的对象中更新的请求。我发现这样做的唯一方法是在状态管理器中逐个获取现有对象,然后逐个更新字段到传入对象的字段。然后将对象状态管理器版本的状态设置为已修改,并保存上下文。使用多对多映射更新分离的EF对象

这适用于不包含导航属性的简单实体。

我现在正试图在一个具有多对多关系的实体上这样做。

想象一下你有一个BlogPost对象和一个Hashtag对象。这是一个多对多的关系。我已经定义了这一点,并且在数据库中我可以看到我有三个表格,BlogPost,HashTag和映射表。

我想要做的就是编辑前端的博客文章,传递更新的博客文章及其新的应用于它的主题标签列表,并更新数据库。

问题是标签列表可能与旧标签完全无关,所以我首先必须清除所有以前的映射,然后添加新的标签。如果它们是相同的,这将是必要的冗余,但实现它的唯一途径。

我无法弄清楚如何在多对多关系中清除以前的映射。我曾尝试

foreach (var tag in dbBlogPost.Hashtags) 
    dbItem.Hashtags.Remove(tag); 

我然后添加新的主题标签为空集,然后做

​​

但是当我保存的资料库,我得到下面的异常

操作失败:该关系无法更改,因为 一个或多个外键属性不可空。当 更改为关系时,相关的外键属性 设置为空值。如果外键不支持空值,则必须定义一个新的关系,外键属性必须为 分配另一个非空值,或者无关对象必须为 删除。

任何人都可以建议我做错了什么?

回答

0

DbSet<TEntity>.Local表示该集合中所有已添加,未更改和已修改实体的本地视图。所以你可以在做任何改变之前清除所有的集合。

dbBlogPost.Hashtags.Local.Clear();