我有以下 2 个表/实体。
public class User
{
[Key]
public Guid UserId { get; set; }
public ICollection<Game> Games { get; set; }
}
public class Game
{
public Guid OwnerId { get; set; }
public User Owner { get; set; }
[Key]
public int GameId { get; set; }
public string GameName { get; set; }
public ICollection<Question> Questions { get; set; }
}
}
我是实体框架核心和 c# 的新手。我的目标是创建一个函数,在游戏表中创建一行,但只允许用户拥有最大数量的与之关联的游戏。
我在下面尝试了以下功能。使用交易没有任何区别。假设对于给定的
Game
和User
,表maxGames=11
中有10条记录。我运行函数 CreateGame。当延迟开始时,我手动在表格中插入一行Game
。延迟完成后,函数插入第 12 行。我希望有一个回滚,这样Game
行数保持11.
public async Task<Boolean> CreateGame(Guid ownerId, string gameName, int maxGames)
{
try
{
using (var transaction = _dbContext.Database.BeginTransaction())
{
Game game = new Game(ownerId: ownerId, gameName: gameName);
// Count games for the given user
var count = _dbContext.Games.Where(g => g.OwnerId == ownerId)
.Select(g => g.OwnerId)
.Count();
// Conditional insert
if (count < maxGames)
{
await Task.Delay(10000); // Delay to simulate race condition
await _dbContext.Games.AddAsync(game);
await _dbContext.SaveChangesAsync();
await transaction.CommitAsync();
Console.WriteLine("Saved");
return true;
}
else
{
await transaction.CommitAsync();
Console.WriteLine("Did not save");
return false;
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
return false;
}
}
为什么代码没有按预期运行?在这种情况下事务是否不起作用,因为 if 条件不是数据库逻辑?