コード例 #1
0
 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();
 }
コード例 #2
0
 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\"");
     }
 }
コード例 #3
0
        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));
        }
コード例 #4
0
        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();
        }