efcore 中的条件插入无法使用事务按预期工作。 (初学者)

问题描述 投票:0回答:0

我有以下 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 条件不是数据库逻辑?

c# entity-framework entity-framework-core
© www.soinside.com 2019 - 2024. All rights reserved.