【发布时间】:2022-01-04 23:17:17
【问题描述】:
我正在尝试从数据库中查询对象,遍历它们并检查列是否有值,如果没有,则创建一个值并将其分配给该列并将其保存到数据库中。我遇到的问题是实体在查询后分离,因此我无法保存更改。下面是我用来查询和更新实体的代码。
DateTime runTime = passedDateTime ?? DateTime.Now;
await using DiscordDatabaseContext database = new();
DateTime startOfWeek = exactlyOneWeek ? runTime.OneWeekAgo() : runTime.StartOfWeek(StartOfWeek);
//Add if not in a Weekly Playlist already and if the video was submitted after the start of the week
List<PlaylistData> pld = await database.PlaylistsAdded.Select(playlist => new PlaylistData
{
PlaylistId = playlist.PlaylistId,
WeeklyPlaylistID = playlist.WeeklyPlaylistID,
Videos = playlist.Videos.Where(
video => (video.WeeklyPlaylistItemId == null ||
video.WeeklyPlaylistItemId.Length == 0) &&
startOfWeek <= video.TimeSubmitted)
.Select(video => new VideoData
{
WeeklyPlaylistItemId = video.WeeklyPlaylistItemId,
VideoId = video.VideoId
}).ToList()
}).ToListAsync().ConfigureAwait(false);
int count = 0;
int nRows = 0;
foreach (PlaylistData playlistData in pld)
{
if (string.IsNullOrEmpty(playlistData.WeeklyPlaylistID))
{
playlistData.WeeklyPlaylistID = await YoutubeAPIs.Instance.MakeWeeklyPlaylist().ConfigureAwait(false);
}
foreach (VideoData videoData in playlistData.Videos)
{
PlaylistItem playlistItem = await YoutubeAPIs.Instance.AddToPlaylist(videoData.VideoId, playlistId: playlistData.WeeklyPlaylistID, makeNewPlaylistOnError: false).ConfigureAwait(false);
videoData.WeeklyPlaylistItemId = playlistItem.Id;
++count;
}
}
nRows += await database.SaveChangesAsync().ConfigureAwait(false);
查询正常工作,我可以使用所有相关的播放列表和视频行,它们仅在指定列中具有正确的数据,并且记录的查询看起来不错,但保存不起作用并调用 database.Entry()在任何播放列表或视频对象上显示它们都已分离。我究竟做错了什么?收藏集是否以不同的方式保存?我的查询应该改变吗?是否有应该更改的初始化设置? (我认为在 init 上设置的唯一设置可能会影响这一点是.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery),但据我所知,记录的查询甚至没有拆分)
【问题讨论】:
标签: c# entity-framework entity-framework-core npgsql