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