如果有更新代码

时间:2017-12-08 22:08:16

标签: c# entity-framework

我正在学习EF,我正在做一个练习,我有三张桌子,一张有很多文件的文件,那些文件有很多图像。我的表是Expediente(文件),Documento(文档)和Archivos(图像)。

我有一个表单,我在datagridview中列出我的所有文件,如果你选择,已经存在的那个,那么你应该能够在该文件中添加更多文档,事情就是我不能这样做如果我添加我的代码来更新。如果尝试添加1个新文档,则没有任何操作不会保存对db的更改既不抛出也不会抛出异常,但如果我尝试添加2个或更多,则会抛出以下异常:

未处理的类型' System.InvalidOperationException'发生在EntityFramework.dll

附加类型为'Entidad.Documento'的实体失败,因为同一类型的另一个实体已具有相同的主键值。使用'附加'方法或将实体的状态设置为“未更改”#39;或者'修改'如果图中的任何实体具有冲突的键值。这可能是因为某些实体是新的并且尚未收到数据库生成的键值。在这种情况下,请使用'添加'方法或“添加”#39;实体状态跟踪图形,然后将非新实体的状态设置为“未更改”。或者'修改'酌情。

代码如下:

foreach (var documento in documentos)
{
    if (documento.idDocumento == 0)
    {
        context.Documentos.Add(documento);
    }
    else
    {
        var entry = context.Entry(documento);
        if (entry.State == EntityState.Detached || entry.State == EntityState.Modified)
        {
            context.Documentos.Attach(documento);
        }
    }
}

附加文档时显示错误。

这只是一个返回void的函数,它只用于保存,它接收一个BindingList,它包含从db中收到的所有文件以及我添加的文件。

问候!

1 个答案:

答案 0 :(得分:0)

我必须改变我更新字段的方法,我做了这个并且它有效:

if (documento.idDocumento == 0)
                    {
                        context.Documentos.Add(documento);
                    }
                    else
                    {
                        Documento updDoc = context.Documentos.FirstOrDefault(x => x.idDocumento == documento.idDocumento);
                        updDoc.NombreDocumento = documento.NombreDocumento;
                    }