none
Guardar varios registros usando un foreach RRS feed

  • Pregunta

  • Hola de nuevo, recien me inicio en MVC

    Estoy recuperando en dos vectores varios registros y debo guardarlos en una base de datos (en una sola tabla)

    entonces pienso que puedo guardar, recorriendo el vector con un foreach y en cada iteracion guardar el registro en la base de datos.

    Pero el primer registro me guarda bien y para el segundo me sale el error

    System.InvalidOperationException: Ya existe un objeto con la misma clave en ObjectStateManager. El objeto existente se encuentra en un estado Modified. Sólo es posible agregar un objeto a ObjectStateManager de nuevo si se encuentra en un estado agregado.   en System.Data.Objects.ObjectContext.VerifyRootForAdd(Boolean doAttach, String entitySetName, IEntityWrapper wrappedEntity, EntityEntry existingEntry, EntitySet& entitySet, Boolean& isNoOperation)   .

    les paso la accion post del controlador

    [

    HttpPost]

           

    publicActionResultCrearNotaEstudiantesGlobal(Notanota, FormCollectionform)

            {

               

    try


                {

                   

    stringtags1 = form["CodigoEstudiantes"];

                   

    char[] delimitadores1 = { ' ', ',', '.', ';'};

                   

    string[] TagsString1 = tags1.Split(delimitadores1);             

                   

    /* foreach (String tagtexto1 in TagsString1)

                    {                   

                            nota.Nota1 = Convert.ToDecimal(tagtexto1);

                    }*/


                   

    intrecorrer = 0;

                   

    stringtags = form["NotaPrimero"];

                   

    char[] delimitadores = { ' ', ',', '.', ';'};

                   

    string[] TagsString = tags.Split(delimitadores);

                   

    //List<Nota> notas = new List<Nota>();


                   

    //if (ModelState.IsValid)


                   

    //{


                       

    foreach(Stringtagtexto inTagsString)

                        {

                           

                            nota.CodigoEstudiante = TagsString1[recorrer].ToString();

                            nota.CodigoMateria = materiaid;

                            nota.Trimestre = 1;

                            nota.Nota1 =

    Convert.ToDecimal(tagtexto);

                     

    //      notas.Add(nota);


                            db.Nota.AddObject(nota);

                            db.SaveChanges();   

                            recorrer++;

                        }

                       

    //db.SaveChanges();


                 

    //  }


                   

    returnRedirectToAction("EstudiantesCurso", new{ CursoID = cursoid, MateriaID = materiaid });

          

    }

               

    catch(Exceptione)

    {

                   

    //Si se introduce un error de direccion http no existente, devolvemos a la vista el error generado


                    ViewData[

    "msg"] = e;

                   

    //ViewData["msg"] = "Se ha producido un error en el registro.";


                   

    returnView("Error");

                }

     

            }

    en TagsString1 recupero los codigos del estudiante

    y en TagsString las notas.

    Con el foreach recorro los 2 vectores y los resultados que me den, los guardo, pero solo me guarda un registro. AYUDA!!!!!


    Luis

    domingo, 2 de diciembre de 2012 21:40

Todas las respuestas

  • Traté de leer su pregunta pero no pude al final; el código es muy molesto con esa mala presentación.  Si pudiera, le agradeceríamos que edite su pregunta para incluir código correctamente indentado.  Utilice la herramienta de código de este foro.

    Jose R. MCP
    Code Samples

    lunes, 3 de diciembre de 2012 5:36
  • Secundo lo que dice @webJose: por favor edita la pregunta para que se vea bien el código.

    Dicho esto tu problema es que estás reutilizando el objeto nota, dentro del foreach. Para EF cada objeto representa a un registro, y es por eso que NO puedes agregar dos veces un mismo objeto.

    Ya de paso... si luego la rellenas en el código del controlador, porque recibes una nota como parámetro en el método de acción?

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    • Propuesto como respuesta classhp viernes, 7 de diciembre de 2012 19:06
    lunes, 3 de diciembre de 2012 11:24