WCF和EF多对多获取重复项
使用上面的模型,我试图保存一个新的WCF和EF多对多获取重复项,wcf,entity-framework,many-to-many,duplicates,constraints,Wcf,Entity Framework,Many To Many,Duplicates,Constraints,使用上面的模型,我试图保存一个新的PamNewsMessage,并向其添加标记,然后将其保存到数据库中。但是,在尝试了添加对象和保存的多种不同组合之后,我仍然存在重复条目(而不是重复键)的相同问题 目前,这是我用来进行更改的,它适用于PamNewsMessage,但是如果标签已经存在,它会生成一个重复的标签 _theService = new WCFPamUpdateServiceEntities3(); _theService.PamNewsMessages.AddObject(pnm);
PamNewsMessage
,并向其添加标记,然后将其保存到数据库中。但是,在尝试了添加对象和保存的多种不同组合之后,我仍然存在重复条目(而不是重复键)的相同问题
目前,这是我用来进行更改的,它适用于PamNewsMessage
,但是如果标签已经存在,它会生成一个重复的标签
_theService = new WCFPamUpdateServiceEntities3();
_theService.PamNewsMessages.AddObject(pnm);
_theService.SaveChanges();
我不确定我在这里还需要做什么,这应该是非常直接的。我读过很多人有类似的问题,但我没有找到明确的解决办法。有人能帮我吗?我已经花了好几个小时在这上面,阅读并尝试各种不同的方法来保存东西,改变状态,等等
谢谢
理查德
很抱歉,无法发布图片,长期读者首次发布海报:-)(为您解决了这个问题-marc_s)当我第一次遇到这个问题时,这是一个小小的理论。是关于EF的一些描述 简单的回答是:英孚不会为你做这件事 您处理分离的对象,现在必须明确告诉EF您所做的更改=这通常意味着处理图中每个实体和图中每个实体的状态(多对多始终是独立关联)。如果调用
AddObject
,则告诉EF添加整个对象图,而不仅仅是单个实体
如果您刚刚知道要添加新闻消息,并且此消息将只有现有标记,则可以执行以下操作:
_theService = new WCFPamUpdateServiceEntities3();
_theService.PamNewsMessages.AddObject(pnm);
foreach (var tag in pnm.Tags)
{
_theService.ObjectStateManager.ChangeObjectState(tag, EntityState.Unchanged);
}
_theService.SaveChanges();
显然,一旦进入更复杂的场景,您也可以添加新标记或删除与现有标记的连接,这个简单的解决方案将不起作用。是的,我已经看过您创建的上述示例,添加新标记时问题仍然存在。基本上,在创建消息时,用户可以选择从现有列表中添加标记,或创建新标记。也许我可以通过单独的调用添加新标记,然后使用此方法保存消息。在这种情况下,您必须检查数据库中是否存在每个标记,这将使一切变得更加复杂,因为您不能将同一标记的两个实例附加到上下文。类似的情况如何。。if(标记存在于上下文中)\ u服务.ObjectStateManager.ChangeObjectState(标记,EntityState.Unchanged);else _theService.ObjectStateManager.ChangeObjectState(tag,EntityState.Added);这取决于您所说的
(标记存在于上下文中)
。您不能在上下文中使用加载的标记,否则AddObject
将引发异常,并且一旦调用AddObject
您将无法从数据库中获取标记。