Tengo las siguientes entidades:

public class Artist
{
    [Key]
    public string ArtistId { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Genre> Genres { get; set; }
}

public class Genre
{
    [Key]
    public int GenreId { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Artist> Artist { get; set; }
}

En mi programa creo algunos artistas y quiero guardarlos:

using (var context = new ArtistContext())
{
    var artists = _fullArtists.Select(x => x.ToArtist());

    foreach (var artist in artists)
    {
        context.Artists.AddOrUpdate(artist);
    }

    context.SaveChanges();
}

Los artistas tienen la propiedad Genre. Desafortunadamente, al llamar a context.SaveChanges();, solo los artistas se guardan en la base de datos y los géneros no.

¿Tengo que configurar algo especial para que también las entidades relacionadas (género) se guarden automáticamente en la base de datos?

Gracias de antemano

Editar: La .ToArtist() se ve así: Editar: El .ToArtist() se ve así:

public static class ArtistExtensions
{
    public static Artist ToArtist(this FullArtistWrapper value)
    {
        if (value == null) { throw new ArgumentNullException(); }

        return new Artist
        {
            ArtistId = value.Id,
            Name = value.Name,
            Genres = new List<Genre>(value.Genres.Select(x => x.ToGenre()))
        };
    }
}

Y la .ToGenre() así: Y el .ToGenre() así:

public static class GenreExtensions
{
    public static Genre ToGenre(this string value)
    {
        return new Genre
        {
            Name = value
        };
    }
}
2
xeraphim 29 ene. 2016 a las 13:44

2 respuestas

La mejor respuesta

Supongo que está utilizando clases de proxy con carga diferida, ya que tiene las propiedades de navegación establecidas como virtual. El problema es que está creando un nuevo List<Genre> en ToArtist que sobrescribirá la colección del proxy. En su lugar, intente agregar los elementos a la colección existente.

El otro problema puede ser que no esté utilizando proxies. Los proxies solo se usarán para nuevas entidades si usa DbSet<T>.Create(). De lo contrario, tendrá que agregar todas las entidades relacionadas al DBContext` manualmente.

1
kjbartel 29 ene. 2016 a las 11:07

Si entendí, si solo desea guardar géneros cuando los artistas se guarden en la base de datos, intente poblar el artista del género. Por ejemplo.

List<Genres> lstGenres...

artist.Genres = lstGenres;

context.Entry(artist).State = EntityState.Added;

Espero que ayude =)

0
Rafael Ribeiro 29 ene. 2016 a las 11:03