我正在学习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中收到的所有文件以及我添加的文件。
问候!
答案 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;
}