Update one for many Entity Framework

4

Hello, I need help with an update using entity framework and one-to-many relationship. I think it's pretty basic, but I'm starting with EF and I can not solve the problem.

Artist and Telephone Artist entities, where an artist can have several phones.

 public class Artista
    {

        public Artista()
        {
            Telefones = new List<TelefoneArtista>();
        }
        public int ArtistaId { get; set; }
        public string Nome { get; set; }
        public string Email { get; set; }
        public virtual ICollection<TelefoneArtista> Telefones { get; set; }
    }

public class TelefoneArtista
    {

        public int TelefoneArtistaId { get; set; }
        public string Numero { get; set; }
        public int ArtistaId { get; set; }
        public virtual Artista Artista { get; set; }

    }

How do I update?

I tried this way but it did not work.

public void Update(Artista obj)
        {
            Db.Entry(obj).State = EntityState.Modified;
            Db.SaveChanges();
        }

Thanks in advance!

    
asked by anonymous 11.01.2016 / 20:58

1 answer

3

I use the following algorithm:

private async Task AtualizarTelefones(Artista artista)
{
    // Telefones Originais
    var telefonesOriginais = db.ArtistaTelefones.AsNoTracking().Where(at => at.ArtistaId == artista.ArtistaId).ToList();

    if (artista.ArtistaTelefones != null)
    {
        // Telefones Excluídos
        foreach (var telefoneOriginal in telefonesOriginais)
        {
            if (!artista.ArtistaTelefones.Any(rt => rt.ArtistaTelefoneId == telefoneOriginal.ArtistaTelefoneId))
            {
                var telefoneExcluido = db.ArtistaTelefones.Single(rt => rt.ArtistaTelefoneId == telefoneOriginal.ArtistaTelefoneId);
                db.ArtistaTelefones.Remove(telefoneExcluido);
                await db.SaveChangesAsync();
            }
        }

        // Telefones Inseridos ou Alterados
        foreach (var telefone in artista.ArtistaTelefones)
        {
            if (!telefonesOriginais.Any(rt => rt.ArtistaTelefoneId == telefone.ArtistaTelefoneId))
            {
                // Telefone não existe ainda. Inserir.
                telefone.ArtistaId = artista.ArtistaId;
                db.ArtistaTelefones.Add(telefone);
            }
            else
            {
                // Telefone já existe. Marcar como alterado.
                db.Entry(telefone).State = EntityState.Modified;
            }

            await db.SaveChangesAsync();
        }
    }
}

Usage:

    public void Update(Artista obj)
    {
        await AtualizarTelefones(obj);
        Db.Entry(obj).State = EntityState.Modified;
        Db.SaveChanges();
    }
    
11.01.2016 / 21:09