【问题标题】:WCF and EF many to many getting duplicatesWCF 和 EF 多对多重复
【发布时间】:2011-09-13 12:45:54
【问题描述】:

使用上面的模型,我正在尝试保存一个新的PamNewsMessage 并向其中添加标签,然后将其保存到数据库中。但是,在尝试了添加对象和保存的许多不同组合之后,我仍然遇到重复条目(不是重复键)的相同问题。

目前,这是我用来进行更改的,它适用于PamNewsMessage,但是如果标签已经存在,它会重复。

_theService = new WCFPamUpdateServiceEntities3();
_theService.PamNewsMessages.AddObject(pnm);
_theService.SaveChanges();

我不确定我还需要在这里做什么,应该很简单。我读过很多人有类似的问题,但我没有找到明确的解决办法。任何人都可以在这里帮助我,我已经搞砸了好几个小时,现在阅读并尝试不同的方法组合来保存东西,改变状态等等。

谢谢,

理查德

很抱歉无法发布图片,长时间阅读第一次海报:-)
(为你解决了这个问题 - marc_s)

【问题讨论】:

    标签: wcf entity-framework many-to-many duplicates constraints


    【解决方案1】:

    Here 是我第一次遇到问题时的一点理论。 Here 是一些与 EF 相关的描述。

    简短的回答是:EF 不会为您执行此操作。

    您使用了分离的对象,现在您必须明确告诉 EF 您做了哪些更改 = 这通常意味着使用图中每个实体的状态以及图中的每个 independent association(多对多始终是独立关联)。如果您致电 AddObject,您是在告诉 EF 添加整个对象图,而不仅仅是单个实体。

    如果您只知道要添加 NewsMessage 并且此消息将只有现有标签,您可以执行以下操作:

    _theService = new WCFPamUpdateServiceEntities3();
    _theService.PamNewsMessages.AddObject(pnm);
    foreach (var tag in pnm.Tags)
    {
        _theService.ObjectStateManager.ChangeObjectState(tag, EntityState.Unchanged);
    }
    _theService.SaveChanges();
    

    显然,一旦您进入更复杂的场景,您还可以添加新标签或删除与现有标签的连接,这个简单的解决方案将不起作用。

    【讨论】:

    • 是的,我已经看过您创建的上述示例,添加新标签时问题仍然存在。基本上,在创建消息时,用户可以选择从现有列表中添加标签,或创建新标签。也许我可以通过单独的调用添加新标签,然后使用此方法保存消息。
    • 在这种情况下,您必须检查数据库中每个标签是否存在,这会使一切变得更加复杂,因为您不能将同一标签的两个实例附加到上下文中。
    • 这样的事情怎么样.. if (标签存在于上下文中) _theService.ObjectStateManager.ChangeObjectState(tag, EntityState.Unchanged); else _theService.ObjectStateManager.ChangeObjectState(tag, EntityState.Added);
    • 这取决于您所说的if(tag exists in context) 是什么意思。您不能使用在上下文中加载的标签,否则AddObject 将抛出异常,一旦您调用AddObject,您将无法从数据库中获取标签。
    猜你喜欢
    • 2021-03-03
    • 1970-01-01
    • 2014-05-19
    • 2021-10-26
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    相关资源
    最近更新 更多