none
Persistir entidad con referencia a entidad existente (Entity Framework) RRS feed

  • Pregunta

  • Hice la pregunta en el subforo de C# pero creo que aqui está mejor colocada puesto que es específica de EF.

    Trato de realizar mi logica de negocio para persistir entidades nuevas en la base de dato usando Entity Framework.

    Mi problema viene cuando trata de persistir la referencia, que ya existe en la base de datos.

    Pongo el ejemplo: tengo una entidad Noticia con algunas propiedades como Titulo, Subtitulo, Pie, Resumen y relacionada con otra entidad MedioComunicacion. En Noticia hay una propiedad de Navegación hacia el MedioComunicacion. Para crear una instancia de Noticia utilizo simplemente new y luego asigno las propiedades, incluida la de navegación MedioComunicacion que obtengo mediante el SelectedItem de un ComboListBox que está enlazado a un List<MedioComunicacion>.

    Mi método Add de la logica de negocio es el siguiente;

    public void Add(Noticia _noticia)
    
            {
    
                using (RepositorioEntities ctx = new RepositorioEntities())
    
                {
    
                    ctx.AddToNoticia(_noticia);
    
                    ctx.SaveChanges();
    
                }
    
            }
    
    

    El problema me viene porque la llamada a AddToNoticia me genera la siguiente excepción:

    InvalidOperationException: "Varias instancias de IEntityChangeTracker no pueden hacer referencia a un objeto de entidad."

    Alguna ayuda?

    Gracias de antemano.

    martes, 29 de septiembre de 2009 15:34

Respuestas

  • Me autorespondo después de investigar más sobre el tema he encontrado un articulo interesante sobre "intríngulis" del Entity Framework.

    http://www.code-magazine.com/article.aspx?quickid=0907071&page=1

    En este articulo se trata el problema que mi lógica de negocio que tiene una solución aparentemente muy sencilla.

    Cuando se asigna una entidad que ya existe en base de datos lo unico que hay que hacer es asignar al objeto Reference correspondiente la EntityKey de la entidad recuperada de base de datos, pero fuera del uso de un contexto. No hay que crear una nueva EntityKey si no usar la existente.

    Bajo mi punto de vista esta forma de trabajar no se adapta bien al trabajo con objetos habitual que deberia hacerse con Entity Framework, pero por lo que he leido es debido a una decisión de diseño del propio framework. Dejo aqui mi código de ejemplo:

    NoticiaDataAccess noticiaDA = new NoticiaDataAccess();
    Noticia nueva = Noticia.CreateNoticia(FechaNoticia.Value, (int)ListaMediosComunicacion.SelectedValue,
    	noticiaDA.SiguienteNoticia((int)ListaMediosComunicacion.SelectedValue, FechaNoticia.Value),
             TituloNoticia.Text, SubtituloNoticia.Text, Resumen.Text);            
    nueva.MedioComunicacionReference.EntityKey = ((MedioComunicacion)ListaMediosComunicacion.SelectedItem).EntityKey;
    noticiaDA.Add(nueva);

    El método Add de NoticiaDataAccess:

    public void Add(Noticia newItem)
    {
            using (RepositorioEntities context = new RepositorioEntities())
                {                
                    context.AddObject("Noticia", newItem);
                    context.SaveChanges();
                }
    }
    martes, 29 de septiembre de 2009 19:41