public void Add(ProductDataModel product, int stock) { using ExpressOrdersContext dbContext = new ExpressOrdersContext(); dbContext.Product.Add(new Product { Name = product.Name, Description = "Simple Description", Price = 12.02M, Stock = stock }); dbContext.SaveChanges(); }
public static void PrepareDb() { using ExpressOrdersContext dbContext = new ExpressOrdersContext(); if (!dbContext.Database.EnsureCreated()) { dbContext.Database.ExecuteSqlRaw("DELETE FROM public.\"Order\""); dbContext.Database.ExecuteSqlRaw("DELETE FROM public.\"Product\""); } }
public void MainTest() { // Init ExpressOrdersContext dbContext = new ExpressOrdersContext(); if (!dbContext.Database.EnsureCreated()) { dbContext.Database.ExecuteSqlRaw("DELETE FROM public.\"Order\""); dbContext.Database.ExecuteSqlRaw("DELETE FROM public.\"Product\""); } ShopStorage storage = new ShopStorage(); Random random = new Random(); ProductDataModel product = new ProductDataModel("Car"); int productsCount = 100; storage.Add(product, productsCount); // Act for (int k = 0; k < 10; k++) { Thread thread = new Thread( new ThreadStart(() => { ShopStorage threadStorage = new ShopStorage(); for (int i = 0; i < 1000; i++) { try { threadStorage.Reserve(product, random.Next(1, 3)); } catch (ArgumentOutOfRangeException) { break; } } }) ); thread.Start(); thread.Join(); } // Assert Assert.Equal(0, dbContext.Product.First().Stock); Assert.Equal(productsCount, dbContext.Order.Sum(o => o.Count)); }
public void Reserve(ProductDataModel product, int count) { using ExpressOrdersContext dbContext = new ExpressOrdersContext(); using TransactionScope scope = new TransactionScope( TransactionScopeOption.RequiresNew, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.Snapshot }); Product entity = dbContext.Product.Where(prod => prod.Name.Equals(product.Name)).Single(); if (entity.Stock == 0 || count > entity.Stock) { throw new ArgumentOutOfRangeException($"\nВыбранное количество товаров нет в наличии. Осталось: {entity.Stock}"); } dbContext.Order.Add(new Order { ProductId = entity.Id, Count = count }); entity.Stock -= count; dbContext.SaveChanges(); scope.Complete(); }