实体框架6 - 保存相关实体

时间:2016-01-29 10:44:49

标签: c# .net entity-framework entity-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();时,只有艺术家才能保存数据库而类型不会。

我是否必须配置一些特殊内容,以便相关实体(类型)自动保存到数据库中?

提前致谢

编辑:.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
        };
    }
}

2 个答案:

答案 0 :(得分:1)

我假设您使用延迟加载的代理类,因为您将导航属性设置为virtual。问题是您在List<Genre>中创建了一个新的ToArtist,它将覆盖代理的集合。请尝试将项目添加到现有集合中。

另一个问题可能是您没有使用代理。如果您使用DbSet<T>.Create(),代理将仅用于新实体。否则,您必须手动将所有相关实体添加到DHCPContext`。

答案 1 :(得分:0)

如果我理解,如果您只是想在艺术家保存在数据库中时保存流派,请尝试填充流派的艺术家。例如。

List<Genres> lstGenres...

artist.Genres = lstGenres;

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

希望有帮助=)