框架 6 - 保存相关实体

本文关键字:实体 保存 框架 | 更新日期: 2023-09-27 18:32:29

我有以下实体:

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

框架 6 - 保存相关实体

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

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

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

List<Genres> lstGenres...
artist.Genres = lstGenres;
context.Entry(artist).State = EntityState.Added;

希望有帮助=)