Pular para o conteúdo principal

Inventory and Orders API for .NET C# and MySQL

Código em ASP.NET Core e MySQL que não vende a última unidade duas vezes, não repete uma alteração e não sobrecarrega as conexões com o banco de dados.

  • .NET SDK
  • C#
  • ASP.NET Core
  • EF Core
  • MySql.EntityFrameworkCore

Capturas de tela

Captura 1 de 11: Cartão de título: Inventory and Orders API, código-fonte .NET C#, com as tecnologias e uma janela de código com dois pedidos para a última unidade: um responde 201 Created e o outro 409 Conflict.

Cartão de título: Inventory and Orders API, código-fonte .NET C#, com as tecnologias e uma janela de código com dois pedidos para a última unidade: um responde 201 Created e o outro 409 Conflict.

Pagamento único

  • ₹ 999+ GST no pagamento
  • US$ 19
  • Baixe na sua biblioteca assim que o pagamento for confirmado.
  • Todas as versões futuras deste projeto estão incluídas, sem custo adicional.
Versão mais recente
1.0.0 · 6 de nov. de 2026

Visão geral

O código-fonte completo de uma API de estoque e pedidos em ASP.NET Core, EF Core e MySQL: categorias, produtos, movimentações de estoque e pedidos, com 20 endpoints. Dois compradores não conseguem levar a última unidade, uma nova tentativa não repete uma alteração e um pico de requisições não sobrecarrega as conexões com o banco de dados. Roda no seu próprio computador em seis etapas.

A maioria dos exemplos de estoque funciona até que duas pessoas comprem a última unidade no mesmo instante, um cliente tente de novo depois de perder uma resposta ou um pico de tráfego chegue ao banco de dados. O Inventory and Orders API for .NET C# and MySQL é o código completo para esses momentos, com resultados de execuções reais no MySQL 9.7.

O que a API faz

  • Categorias e produtos. Pesquise, filtre, ordene e pagine produtos, arquive e restaure, e liste os que estão no nível de reposição ou abaixo dele.
  • Estoque. Registre entregas e correções, com o histórico completo de cada alteração em cada produto.
  • Pedidos. Crie um pedido e depois conclua ou cancele. Ao cancelar, o estoque volta.
  • 20 endpoints e 2 verificações de integridade. Um arquivo .http traz uma requisição para cada endpoint, e o Scalar adiciona documentação interativa em Development.

Feita para os momentos que quebram uma demo

  • Dois compradores, uma última unidade. Uma única instrução bloqueia a linha, confere a quantidade e retira o estoque. De dois pedidos enviados no mesmo instante, um recebeu 201 Created e o outro 409 Conflict.
  • Uma nova tentativa não repete uma alteração. Pedidos e alterações de estoque aceitam um Idempotency-Key. O mesmo pedido enviado duas vezes voltou como o mesmo pedido, e o estoque foi retirado uma só vez.
  • Um pico não derruba o processo. Com o pool padrão do MySql.Data, 150 requisições ao mesmo tempo em uma API recém-iniciada derrubaram o processo inteiro em 17 de 26 execuções. Esta API só deixa rodar ao mesmo tempo as requisições que o pool de conexões permite, e o mesmo pico passou sem erros em 8 de 8 execuções. 600 pedidos enviados ao mesmo tempo foram todos criados em 5,5 segundos, com o estoque exato.
  • Edições não se sobrescrevem. Uma alteração baseada em uma versão antiga de um produto recebe um 409, e um pedido só pode ser concluído ou cancelado uma vez.
  • Respostas claras quando o MySQL está fora do ar. Os clientes recebem um 503 com Retry-After e sem stack trace, e a API continua sozinha quando o MySQL volta.

Uma conexão com o MySQL bem cuidada

  • Criptografada. A configuração usa SslMode=Required, o README mostra como passar para VerifyFull e, fora de Development, o app avisa ao iniciar se não estiver verificando o servidor.
  • Privilégio mínimo. Uma conta para a API, que só pode ler e alterar linhas, e outra para as migrações.
  • Limites de tempo no servidor. Por padrão, uma instrução espera no máximo 5 segundos por um bloqueio de linha, e um SELECT roda por no máximo 30 segundos. Eles ficam no servidor porque as chamadas assíncronas do MySql.Data não param em CommandTimeout.
  • Novas tentativas que funcionam. O provedor da Oracle não trata nenhum erro do MySQL como temporário se ele não estiver em uma lista. Este código lista esses erros e começa cada nova tentativa com uma conexão limpa.
  • Migrações como etapa própria. Cinco migrações do EF Core criam as cinco tabelas, e o app nunca faz a própria migração.

Código para você construir em cima

  • Estrutura clara. Minimal APIs com uma pasta por funcionalidade, em uma solução com projetos separados para a API e os dados.
  • Builds rigorosos. Avisos são erros, os analisadores recomendados estão ativados e todas as versões de pacotes ficam em um só arquivo.
  • Erros consistentes e logs seguros. Todo erro usa o formato problem details, os logs são JSON fora de Development e a senha nunca chega a eles.
  • Segredos fora do código. .env para o MySQL local, user-secrets em desenvolvimento e uma variável de ambiente em todo o resto.

O que não está incluído

É o código da API e nada mais, para você saber o que acrescentar:

  • Sem interface. Ela responde JSON.
  • Sem login. Coloque a sua própria autenticação ou gateway na frente.
  • Sem projeto de testes. Os resultados acima vêm de executá-la com o MySQL, não de testes automatizados incluídos no arquivo.
  • Sem hospedagem. Como implantar fica a seu critério, e o README lista o que o código espera do ambiente onde roda.

Rode em seis etapas

  1. Crie as senhas locais.
  2. Inicie o MySQL com o Docker Compose.
  3. Dê à API e às migrações as próprias contas.
  4. Crie as tabelas.
  5. Guarde a string de conexão.
  6. Inicie a API e abra a documentação dela.

O README traz todos os comandos, para macOS e Linux e para PowerShell. How to Set Up and Run the Inventory and Orders API (abre em uma nova aba) (em inglês) mostra cada etapa com o que ela deve exibir. Foi testado a partir de uma cópia limpa no macOS, no zsh e no PowerShell 7.

Como ele foi construído

A série gratuita de tutoriais em 5 partes How to Connect a .NET C# Web API to a MySQL Database (abre em uma nova aba) (em inglês) explica a conexão, as migrações, a leitura e a escrita de dados, as transações e os bloqueios, e o checklist de produção por trás deste código.

Série de tutoriais gratuita

How to Connect a .NET C# Web API to a MySQL Database

Prefere aprender construindo? Este guia gratuito e passo a passo no nosso blog mostra como o projeto é feito.

Ler a série (abre em uma nova aba)

O que você leva

Tudo o que está no arquivo, em um relance.

  • A versão 1.0.0 do código-fonte completo: uma solução .NET 10 com um projeto de API e um de dados
  • 20 endpoints para categorias, produtos, estoque e pedidos, além de verificações de integridade de liveness e readiness
  • Cinco migrações do EF Core que criam as cinco tabelas do MySQL
  • Pedidos que não vendem a última unidade duas vezes, e Idempotency-Key em pedidos e alterações de estoque
  • Um limite de requisições simultâneas definido pelo pool de conexões, além de um limite por cliente e um limite de tamanho de requisição
  • Uma estratégia de novas tentativas e limites de tempo no servidor, feitos para o provedor MySQL da Oracle
  • Um compose.yaml que roda o MySQL 9.7 para desenvolvimento, e um .env.example
  • Um arquivo .http com uma requisição para cada endpoint, e documentação do Scalar em Development
  • Um README com os comandos de instalação para macOS, Linux e PowerShell, todas as configurações e o que fazer antes da produção

Feito com

As versões e os ambientes exatos com que foi criado e testado.

  • .NET SDK10.0.403
  • C#14
  • ASP.NET Core10.0.14
  • EF Core10.0.14
  • MySql.EntityFrameworkCore10.0.12
  • MySql.Data26.10.0
  • Scalar.AspNetCore2.19.0
  • dotnet-ef10.0.14
  • MySQL9.7.4
  • Docker Compose5.6.1

O que há no arquivo

A árvore de pastas que você recebe ao descompactar.

inventory-orders-api-dotnet-csharp-mysql/

  • src/
  • .editorconfig
  • .env.example
  • .gitattributes
  • .gitignore
  • compose.yaml
  • Directory.Build.props
  • Directory.Packages.props
  • dotnet-tools.json
  • global.json
  • README.md

O que ele precisa de você

As contas e os serviços que ele espera encontrar, para nada surpreender.

  • O SDK do .NET 10
  • Docker Compose, com o Docker Desktop ou outra instalação, para o MySQL local
  • Um servidor MySQL para produção: foi testado com o MySQL 9.7 LTS no Docker, não com um serviço gerenciado
  • O seu próprio login ou gateway antes de expor a API a algo em que você não confia, porque ela é aberta
  • Uma hospedagem que reinicie o processo se ele terminar: um handshake TLS travado faz o MySql.Data lançar uma exceção que nenhum código consegue capturar
  • Opcional: VS Code ou Visual Studio

Versões

Todas as versões até agora, da mais recente para a mais antiga.

  1. 1.0.0Mais recente

    Primeira versão do código-fonte completo.

    • Uma API de estoque e pedidos em ASP.NET Core e MySQL, com 20 endpoints para categorias, produtos, estoque e pedidos.
    • Dois compradores não conseguem levar a última unidade, e uma requisição repetida com o mesmo Idempotency-Key não repete a alteração.
    • Um pico de requisições espera a sua vez em vez de sobrecarregar as conexões com o banco de dados.
    • Contas do MySQL com privilégio mínimo, uma conexão criptografada, migrações do EF Core e um README que leva você do arquivo à API rodando.

Source Code Licence

O que você pode fazer com ele

What you may and may not do with the source code you buy.

Ler a licença completa
  1. What this licence covers

This licence governs every file included in a product you buy from Dewiride Store: source code, configuration, database scripts, sample data, documentation and any other file in the download. It takes effect when your payment is confirmed and applies to every release of that product that reaches your library. Files that reach your library through an annual updates membership are governed in exactly the same way.

It forms part of the Terms of Sale and Use. Where a product page states different or additional licence terms for that product, those terms prevail for that product. The membership page may likewise state different or additional licence terms for the files a membership carries, and those terms then prevail for those files.

  1. The licence we grant you

We grant you a perpetual, worldwide, non-exclusive, non-transferable licence to use, reproduce, adapt, translate and modify the files, and to include the result in your own work, on the conditions set out below.

Perpetual means it does not expire. Worldwide means it is not limited to any country. Non-exclusive means we license the same product to other customers. Non-transferable means you cannot pass it on to someone else.

The licence is granted to you — either you personally, or the organisation you identified when buying. Everyone working within that organisation may use the files for that organisation’s projects. Nobody outside it may.

  1. What you may do
  • Use and change the files in your own projects, commercial or otherwise, with no limit on the number of projects.
  • Build a product or a service on them and charge your own customers for it.
  • Deploy the result for a client, as part of work you are doing for that client.
  • Distribute the result in compiled, deployed or otherwise non-source form.
  • Keep as many back-up copies as you reasonably need.
  • Study, observe and test how the code works, and obtain the information you need to make it work with your own software.

The last two are yours by law under sections 52(1)(aa) to (ac) of the Indian Copyright Act, 1957, and nothing in this licence is intended to take them away.

  1. What you may not do
  • Resell, sublicense, redistribute or publish the files themselves, in whole or in substantial part, in source form.
  • Include them in a template, starter kit, course, tutorial repository or component library that you sell or give away, where the code is the thing being supplied.
  • Share your account, your download links or your invoices with anyone outside your organisation.
  • Publish the files in a public repository, or in any other place where they can be obtained without buying them.
  • Remove or obscure the copyright and attribution notices in the source files.
  • Use the files to build something whose main purpose is to compete with Dewiride Store as a supplier of the same code.

The distinction that matters is simple: you may sell what you build with the code; you may not sell the code.

  1. Third-party components

Our products depend on open-source libraries, frameworks and services that we did not write. Those remain under their own licences, which we do not and cannot change. Where a product includes or requires such a component, its licence is named in the product’s documentation, and complying with it is your responsibility.

  1. Releases

Every release of a product you own is covered by this same licence and appears in your library at no extra cost. A release you have already downloaded remains licensed to you even if we later stop publishing the product. A release that reached your library through an annual updates membership is licensed to you on these same terms, and stays licensed after the period that carried it has ended.

  1. Ownership

We keep ownership of the files and of the copyright in them. You own whatever you create with them: your changes, your additions and the product you build are yours.

  1. If this licence ends

This licence ends if you materially breach it and do not put the breach right within thirty days of us asking you to in writing. It also ends if your payment is reversed or refunded, because the purchase it depends on no longer stands. Where a membership period is refunded or reversed, the licence ends for the releases that period carried and for nothing else: anything you bought separately, or that another period carried, is unaffected.

If it ends, you must stop using the files and delete the copies you hold. Work you had already delivered to a client before that point may continue in use, so that ending this licence never breaks something your own customer relies on.

  1. No warranty beyond the description

The warranties and limits in section 19 and section 20 of the Terms of Sale and Use apply to this licence as well.

  1. Governing law

This licence is governed by the law of India, and section 24 of the Terms of Sale and Use applies to any dispute about it. If a translation and the English version differ in meaning, the English version governs.