我有以下实体:
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
};
}
}
答案 0 :(得分:1)
我假设您使用延迟加载的代理类,因为您将导航属性设置为virtual
。问题是您在List<Genre>
中创建了一个新的ToArtist
,它将覆盖代理的集合。请尝试将项目添加到现有集合中。
另一个问题可能是您没有使用代理。如果您使用DbSet<T>.Create()
,代理将仅用于新实体。否则,您必须手动将所有相关实体添加到DHCPContext`。
答案 1 :(得分:0)
如果我理解,如果您只是想在艺术家保存在数据库中时保存流派,请尝试填充流派的艺术家。例如。
List<Genres> lstGenres...
artist.Genres = lstGenres;
context.Entry(artist).State = EntityState.Added;
希望有帮助=)