none
Clonar entidad EF RRS feed

  • Pregunta

  • Hola chicos, me estoy desesperando un poco ya, a ver si a vosotros os ha ocurrido algo parecido y me podeis echar un ojo.

    Estuve buscando en Internet como clonar una entidad en entity framework, porque en un proyecto en el que estoy trabajando desean clonar un colaborador, lo único que cambiaría sería la Primary Key.

    El código que estoy usando lo saque de aqui http://www.codeproject.com/Articles/137853/Cloning-the-Entity-object-and-all-related-, y mi codigo es este 

    using (CRMEntities context = new CRMEntities())
                    {
                        Colaboradores viejo = context.Colaboradores.First(nt => nt.ID == idColaborador);

                        var EMpnew = Clonehelper.Clone<Colaboradores>(viejo);

                        EMpnew.ClearEntityReference(false);
                        
                        context.Detach(viejo);
                        EMpnew.EntityKey = null;
                       
                        context.AddToColaboradores((Colaboradores)EMpnew);
                        context.SaveChanges();
                        context.AcceptAllChanges();
                    }

    EL problema parece estar en que no hace correctamente el Detach de la entidad antigua y al hacer el AddToColaboradores me salata el siguiente error;

    "An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key"

    No se muy bien porque pasas, por que todo el mundo en Internet parece usar este mismo código pero a mi no me funciona, si alguien tiene alguna idea por favor que no dude en contestar.

    Un saludo y muchas gracias chicos.


    jueves, 27 de diciembre de 2012 9:02

Respuestas

  • si creas una nueva instancia, funciona ?

    using (CRMEntities context = new CRMEntities())
    {
    	Colaboradores viejo = context.Colaboradores.First(nt => nt.ID == idColaborador);
    
    	Colaboradores EMpnew = new Colaboradores()
    	{
    	   prop1 = viejo.prop1,
    	   prop2 = viejo.prop2,
    	   prop3 = viejo.prop3
    	}
       
    	context.AddToColaboradores(EMpnew);
    	context.SaveChanges();
    	context.AcceptAllChanges();
    }

    si haces esto inserta la nueva entidad

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 27 de diciembre de 2012 17:56

Todas las respuestas


  • pero el  Detach() no elimina ese colaborador viejo, digo si es eso lo que querias lograr

    o sea esa entidad "viejo" debes removerla con el delete para luego insertar la nueva

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 27 de diciembre de 2012 14:03
  • No, no quiero eliminarla simplemente incluir la nueva con un id diferente
    jueves, 27 de diciembre de 2012 15:15
  • pero donde le cambias el id ?

    porque alli clonas pero nunca asignas un id nuevo

    no haces un

    EMpnew.Id = 10

    o sea debes cambiarlo sino seguira con el mismo id

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 27 de diciembre de 2012 15:26
  • EL problema es que el id es autoincremental por eso hago  

    EMpnew.EntityKey = null;


    jueves, 27 de diciembre de 2012 16:22
  • si creas una nueva instancia, funciona ?

    using (CRMEntities context = new CRMEntities())
    {
    	Colaboradores viejo = context.Colaboradores.First(nt => nt.ID == idColaborador);
    
    	Colaboradores EMpnew = new Colaboradores()
    	{
    	   prop1 = viejo.prop1,
    	   prop2 = viejo.prop2,
    	   prop3 = viejo.prop3
    	}
       
    	context.AddToColaboradores(EMpnew);
    	context.SaveChanges();
    	context.AcceptAllChanges();
    }

    si haces esto inserta la nueva entidad

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 27 de diciembre de 2012 17:56
  • Gracias Leandro al final es lo que he hecho al no encontrar otra solucion, pero lo de asignar propiedad a propiedad era justo lo que me quería evitar con el clonado, pero bueno hasta que encuentre otra cosa.

    Por cierto he intentado marcar tu ultimo comentario como respuesta pero no me deja.

    Gracias por todo.

    Un abrazo


    • Editado borja garcia viernes, 28 de diciembre de 2012 8:56
    viernes, 28 de diciembre de 2012 8:54