Question :
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!
Answer :
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();
}