保存更改时实体框架 SQLite 并发错误

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

我正在制作一个服务器应用程序,当我添加一个新用户时,它的逻辑确实有效,但是当我向购物车添加一个新项目时,一切都会变得混乱。我在保存更改时遇到并发错误。

    public static async Task<bool> TryAddUserAsync(string name, string email, string password)
        {
            using (var database = new Database())
            {
                try
                {
                    var existingUser = await database.Users.FirstOrDefaultAsync(u => u.Email == email);
                    if (existingUser != null)
                    {
                        Console.WriteLine("User with this email already exists.");
                        return false;
                    }

                    var user = new User() { Email = email, Name = name, Password = password, Role = "Customer" };
                    database.Users.Add(user);
                    database.ShoppingCarts.Add(new ShoppingCart() { Id = user.Id, View = new List<MedicineShoppingCartView>() });
                    await database.SaveChangesAsync();
                    Console.WriteLine("SUCCESS SIGN UP");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                    return false;
                }
                return true;
            }
        }

这是我添加用户的逻辑。有用。这是我添加到购物车的逻辑。它不起作用:

 public async static Task<bool> TryAddToCartAsync(int id, string key)
        {
            try
            {
                using (var database = new Database())
                {
                    // Начинаем транзакцию
                    using (var transaction = database.Database.BeginTransaction())
                    {
                        // Получаем пользователя
                        var user = await database.Users.FirstOrDefaultAsync(u => u.Email == key);

                        if (user == null)
                            return false;

                        
                        var cart = await database.ShoppingCarts.Include(sc => sc.View)
                                                .Where(u => u.Id == user.Id)
                                                .FirstOrDefaultAsync();

                        // Пытаемся получить товар из базы данных
                        var medicine = await GetByIdFromDatabaseAsync(id);
                        if (medicine == null)
                            return false;

                        // Ищем товар в корзине пользователя
                        var existingItem = cart.View.FirstOrDefault(c => c.Id == id);
                        if (existingItem != null)
                        {
                            // Увеличиваем количество товара, если он уже есть в корзине
                            existingItem.Count += 1;
                        }
                        else
                        {
                            // Добавляем товар в корзину, если его там нет
                            cart.View.Add(new MedicineShoppingCartView() { Id = medicine.Id, Count = 1 });
                        }

                        // Сохраняем изменения в базе данных
                        await database.SaveChangesAsync();

                        // Фиксируем транзакцию
                        transaction.Commit();

                        return true; // Операция выполнена успешно
                    }
                }
            }
            catch (Exception ex)
            {
                // Обработка ошибок
                Console.WriteLine(ex);
                return false;
            }
        }

这就是我使用此功能的地方:

private async Task AddToCartAsync(JsonElement jsonObject, NetworkStream stream)
    {
        if (!jsonObject.TryGetProperty("Id", out JsonElement js_id))
            return;
        
        var id = js_id.GetInt32();
        
        var add_result = await Manager.TryAddToCartAsync(id, key);
        
        byte[] dataToSend;
        if (add_result)
        {
            dataToSend = JsonSerializer.SerializeToUtf8Bytes<int>((int)SentDataMessages.SUCCESS);
        }
        else
        {
            dataToSend = JsonSerializer.SerializeToUtf8Bytes<int>((int)SentDataMessages.ERROR);
        }
        await stream.WriteAsync(dataToSend, 0, dataToSend.Length);
    }

主要功能:

private async Task HandleClientAsync(TcpClient client)
    {
        try
        {
            NetworkStream stream = client.GetStream();
            byte[] buffer = new byte[102400];
            int bytesRead;
            
            while (!breakpoint && (bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) > 0)
            {
                if (breakpoint)
                    break;
                string data = Encoding.UTF8.GetString(buffer, 0, bytesRead);
                Console.WriteLine("Received: {0}", data);
                byte[] dataToSend = new byte[1];
                var jsonObject = JsonSerializer.Deserialize<JsonElement>(data);
                int query_code = jsonObject.GetProperty("QueryType").GetInt32();
                var user_name = string.Empty;
                var user_login = string.Empty;
                var user_password = string.Empty;
                var category = string.Empty;
                int count = 0;
                int id = 0;
                switch (query_code)
                {
                    case (int)QueryTypes.EXIT:
                        Exit(client, stream);
                        break;
                    case (int)QueryTypes.LOGIN:
                        await LoginAsync(jsonObject, stream);
                        break;
                    case (int)QueryTypes.REGISTER:
                        await RegisterAsync(jsonObject, stream);
                        break;

                    case (int)QueryTypes.SEARCH:
                        await SearchAsync(jsonObject, stream);
                        break;
                    case (int)QueryTypes.GET_CART:
                        await GetCartAsync(stream);
                        break;
                    case (int)QueryTypes.GET_BY_ID:
                        await GetByIdAsync(jsonObject, stream);
                        break;

                    case (int)QueryTypes.ADD_TO_CART:
                        await AddToCartAsync(jsonObject, stream);
                        break;
                    case (int)QueryTypes.DELETE_FROM_CART:
                        await DeleteFromCartAsync(jsonObject, stream);
                        break;
                    case (int)QueryTypes.SET_CART_ITEM_COUNT:
                        await SetCartItemCountAsync(jsonObject, stream);
                        break;
                }
            }

            
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception: {0}", ex);
        }

    }

我尝试锁定线程,使一切异步并使用事务。没有任何效果。

c# sqlite entity-framework server
1个回答
0
投票

在这一行中:

cart.View.Add(new MedicineShoppingCartView() { Id = medicine.Id, Count = 1 });

药品购物车ID设置为药品ID,当其他用户添加相同商品时ID会重复。 在药品购物车中,您需要列:

  • 身份证
  • 医学ID
  • 计数(数量)
© www.soinside.com 2019 - 2024. All rights reserved.