更新具有多对多关系的实体

时间:2015-06-10 09:09:11

标签: c# entity-framework ef-code-first many-to-many entity-framework-6

我有一个有多对多关系的模型:

public class Transport
{
    ...
    public virtual ICollection<Remark> CargoRemarks { get; set; }
    ...
}

public class Remark
{
    public virtual ICollection<Transport> Transports { get; set; }
}

在某些情况下,我必须更新包含一些备注的Transport模型。添加或删除备注时,不会附加模型(由于某些架构决策,这无法完成)。

但是,如果没有更改我的传输中的任何备注,则传输对象的更新将失败:

'...Transport' failed because another entity of the same type already has the same primary key value. This can happen when using the 'Attach' method or setting the state of an entity to 'Unchanged' or 'Modified' if any entities in the graph have conflicting key values. This may be because some entities are new and have not yet received database-generated key values. In this case use the 'Add' method or the 'Added' entity state to track the graph and then set the state of non-new entities to 'Unchanged' or 'Modified' as appropriate.

示例:

  • 我的传输模型已创建并插入数据库并附带一些备注。一切都运转正常。
  • 稍后再次加载此插入的模型并分离。
  • 我没有更改(未添加或删除模型中的任何注释)我想要更新它的模型。这会导致出现此错误消息。

这是我要求更新实体的方法:

public virtual void Update(TEntity entityToUpdate)
{
    dbSet.Attach(entityToUpdate);
    context.Entry(entityToUpdate).State = EntityState.Modified;
}

1 个答案:

答案 0 :(得分:0)

从我的角度来看,您的问题与M2M关系无关。它与Attach相同。

我建议的一件事是考虑从db而不是Attach重新加载实体。背后的原因是您无法确定此实体是否以您尝试附加它的形式存在于数据库中。

如果这不是一个选项,您是否尝试过不附加实体?如果它已经设置了实体密钥,它应该根据以下内容正确更新:

https://msdn.microsoft.com/en-us/data/jj592676.aspx