Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WCF和EF多对多获取重复项_Wcf_Entity Framework_Many To Many_Duplicates_Constraints - Fatal编程技术网

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
您将无法从数据库中获取标记。