我正在做一个有趣的项目,我在为用户保存当前的GuildId,UserId,其级别和当前的Exp。它可以部分起作用,但似乎只能抓住一个条件的第一个结果。
我尝试了多种不同的方法来从数据库中选择项目,但是由于这是一种爱好,我觉得我缺少一些非常明显的东西。我已经记录了获取UserId和GuildId的方式,它们返回了正确的值。
如果不存在,它将当前添加一个新条目,并且将正确更新Xp,但仅更新一个条目。似乎会忽略GuildId,而只是找到与UserId匹配的第一个条目并将其保存在那里。
context.forward(key, value, To.all().withTimestamps())
我希望它将Xp保存到同时满足GuildId和UserId条件的条目。
答案 0 :(得分:0)
您可以像这样稍微重构代码以使其更高效。您的代码确实可以执行您所描述的内容。如果只返回单个/空结果,则应使用SingleOrDefault
/ SingleOrDefaultAsync
,以确保更多结果将导致InvalidOperationException
。
public static async Task SaveExp(ulong guildId, ulong userId, int level, uint xp, DateTime cooldown)
{
using (var dbContext = new DatabaseHandler())
{
var current = await dbContext.Exps.FirstOrDefaultAsync(x => x.GuildId == guildId && x.UserId == userId);
if (current != null)
{
current.Xp += xp;
current.Level += level;
// you should not need this next line in EF6
// the entity is already attached as you just retrieved it and should be tracked
dbContext.Exps.Update(current);
}
else
{
dbContext.Exps.Add(new Exp
{
GuildId = guildId,
UserId = userId,
Level = level,
Xp = xp,
Cooldown = cooldown
});
}
await dbContext.SaveChangesAsync();
}
}