gpt4 book ai didi

c# - Entity Framework 模型中的集合未更新

转载 作者:太空狗 更新时间:2023-10-30 01:29:04 27 4
gpt4 key购买 nike

我有几个简单的模型。一个 PlaylistEntry 模型和一个包含 PlaylistEntry 模型集合的 Playlist 模型。

播放列表:

    public class Playlist
{
private ICollection<PlaylistEntry> playlistEntries;

public int PlaylistId { get; set; }

public string Name { get; set; }

public virtual ICollection<PlaylistEntry> PlaylistEntries
{
get => this.playlistEntries ?? (this.playlistEntries = new HashSet<PlaylistEntry>());
set => this.playlistEntries = value;
}
}

播放列表条目

    public class PlaylistEntry
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int PlaylistEntryId { get; set; }

public string FilePath { get; set; }

[ForeignKey("Playlist")]
public int PlaylistId { get; set; }

[Required]
public Playlist Playlist { get; set; }
}

当我将 PlaylistEntry 添加到处于分离状态的 Playlist 时,我希望当我附加并保存更改时,对 PlaylistEntries 列表的更改也将被保存。他们不保存,列表为空。

这是我的代码:

    var playlist = new Playlist { Name = "My first playlist" };
using (var context = new MusicPlayerContext(stringBuilder))
{
context.Playlists.Add(playlist);
context.SaveChanges();
}

playlist.PlaylistEntries.Add(new PlaylistEntry { FilePath = "lkdfj", PlaylistId = playlist.PlaylistId });

using (var context = new MusicPlayerContext(stringBuilder))
{
context.Playlists.Attach(playlist);
context.Entry(playlist).State = EntityState.Modified;
context.SaveChanges();
}

using (var context = new MusicPlayerContext(stringBuilder))
{
context.Playlists.Include(x => x.PlaylistEntries).ToList();
}

最后一次 ToList 调用返回了我创建的播放列表,但其中的 PlaylistEntries 集合是空的。

谁能发现我做错了什么或提出不同的解决方案?我在这上面花了大约 7 个小时,但我终究还是想不通。

最佳答案

您缺少的功能是上下文缓存的工作方式。当您将实体(手动或通过从数据库请求实体)附加到上下文时, Entity Framework 监视更改并跟踪这些更改。

您已将对象添加到实体的属性中,然后将其添加到上下文中。 Entity Framework 现在正在观察它的变化以做任何额外的工作。 所有 以这种方式添加的对象都标记为未更改。将父项标记为已更改 不会将导航属性标记为已更改

您可以将实体添加到上下文中的属性:

using (var context = new MusicPlayerContext())
{
Console.WriteLine("Save PlayList 2 (in context add)");
context.Playlists.Attach(playlist3);
playlist3.PlaylistEntries.Add(new PlaylistEntry {
FilePath = "Entry3",
PlaylistId = playlist3.PlaylistId, PlaylistEntryId = 3
});
context.SaveChanges();
}

... OR 在附加父对象后标记两个对象条目。

using (var context = new MusicPlayerContext())
{
Console.WriteLine("Save PlayList 2 (full attach)");
context.Playlists.Attach(playlist2);
context.Entry(playlist2).State = EntityState.Modified;
context.Entry(playlist2.PlaylistEntries.First()).State = EntityState.Added;
context.SaveChanges();
}

在这两种情况下,当 SaveChanges() 发生时, Entity Framework 现在知道在数据库中做什么。

DotNetFiddle

关于c# - Entity Framework 模型中的集合未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54602569/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com