我試圖從資料庫中查詢物件,遍歷它們并檢查列是否有值,如果沒有,則創建一個值并將其分配給該列并將其保存到資料庫中。我遇到的問題是物體在查詢后分離,因此我無法保存更改。下面是我用來查詢和更新物體的代碼。
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)但就我所見,記錄的查詢甚至沒有拆分)
uj5u.com熱心網友回復:
您使用投影物件
- 播放串列資料
- 視頻資料
據我所知,EF 核心不會跟蹤投影物件。所以解決方案是選擇DbSet的物體物件(指在database.PlaylistsAdded和playlist.Videos屬性中指定的型別)或者在更新之前選擇那些物件然后更新它們。
更新:
第二個選項的示例代碼:
foreach (PlaylistData playlistData in pld)
{
var playlist = database.PlaylistsAdded
.Include(x=> x.Videos)
.First(x => x.PlaylistId == playlistData.playlistData);
if (string.IsNullOrEmpty(playlistData.WeeklyPlaylistID))
{
playlist.WeeklyPlaylistID = await YoutubeAPIs.Instance.MakeWeeklyPlaylist().ConfigureAwait(false);
}
foreach (VideoData videoData in playlistData.Videos)
{
var video = playlist.Videos.First(x=> x.VideoId == videoData.VideoId);
PlaylistItem playlistItem = await YoutubeAPIs.Instance.AddToPlaylist(videoData.VideoId, playlistId: playlistData.WeeklyPlaylistID, makeNewPlaylistOnError: false).ConfigureAwait(false);
video.WeeklyPlaylistItemId = playlistItem.Id;
count;
}
}
注意:這會產生雙重選擇,所以第一個選項更受歡迎
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/403886.html
標籤:
上一篇:Unity中旋轉回圈中的物件
下一篇:如何取消/停止協程并暫停協程?
