我正在制作一个服务器应用程序,当我添加一个新用户时,它的逻辑确实有效,但是当我向购物车添加一个新项目时,一切都会变得混乱。我在保存更改时遇到并发错误。
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);
}
}
我尝试锁定线程,使一切异步并使用事务。没有任何效果。
在这一行中:
cart.View.Add(new MedicineShoppingCartView() { Id = medicine.Id, Count = 1 });
药品购物车ID设置为药品ID,当其他用户添加相同商品时ID会重复。 在药品购物车中,您需要列: