2016-01-29 3 views
0

я следующие объекты:Entitiy Framework 6 - Сохранить связанные объекты

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; } 
} 

В моей программе я создаю несколько художников и хочу сохранить их:

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

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

    context.SaveChanges(); 
} 

художников имеет свойство Genre. К сожалению, при звонке context.SaveChanges();, только художники получают сохраненную базу данных, а жанры - нет.

Должен ли я настроить что-то особенное, чтобы также связанные объекты (жанр) автоматически сохранялись в базе данных?

Заранее спасибо

Edit: .ToArtist() выглядит следующим образом:

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())) 
     }; 
    } 
} 

И в .ToGenre() так:

public static class GenreExtensions 
{ 
    public static Genre ToGenre(this string value) 
    { 
     return new Genre 
     { 
      Name = value 
     }; 
    } 
} 
+0

Что ваш код ToArtist()? Вы добавляете жанр в контекст? – romanoza

+0

hey @romanoza благодарит вас за комментарий, я добавил код к вопросу :-) – xeraphim

ответ

1

Я предполагаю, что вы используете прокси-классы с ленивой загрузкой, так как у вас есть свойства навигации, установленные как virtual. Проблема в том, что вы создаете новый List<Genre> в ToArtist, который перезапишет коллекцию прокси. Попробуйте просто добавить элементы в существующую коллекцию.

Другой проблемой может быть то, что вы не используете прокси. Прокси будут использоваться только для новых объектов, если вы используете DbSet<T>.Create(). В противном случае вам придется добавить все связанные сущности в файл DbContext` вручную.

+0

спасибо! это решило мою проблему :-) – xeraphim

0

Если я понял, если вы просто хотите сохранить жанры, когда художники будут сохранены в базе данных, попробуйте заполнить артист жанра. Например.

List<Genres> lstGenres... 

artist.Genres = lstGenres; 

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

Надежда, что помогает =)

Смежные вопросы