Os aplicativos ASP.NET CRUD incluem a interação com dados que consistem em criar, ler, atualizar e excluir. Em Parte 1Em seguida, configuramos um projeto básico do ASP.NET Core. Em Parte 2adicionamos o primeiro ler usando uma consulta SQL++ em relação aos dados da lista de desejos. Em Parte 3Adicionamos outro ponto de extremidade de leitura, desta vez usando a API de valor-chave.
Até este ponto, as únicas modificações de dados que fizemos foram diretamente na interface do usuário do Couchbase Capella. Nesta postagem, vamos adicionar um endpoint para lidar com a criação e a atualização dos dados da lista de desejos.
SQL++ versus valor-chave: Revisitado
O SQL++ inclui INSERIR, ATUALIZAÇÃO, DELETE sintaxe. Portanto, poderíamos usar o SQL++ para criar um ponto de extremidade para alterar dados. Ele seria muito semelhante ao código escrito em Parte 2.
Uma palavra-chave no SQL++ que você talvez não tenha visto antes é UPSERT. Como você pode imaginar, é uma combinação de ATUALIZAÇÃO e INSERIR. Uma atualização ocorrerá se os dados já existirem; uma inserção ocorrerá se não existirem. Veja como pode ser um endpoint upsert usando SQL++:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[HttpPost] [Route("api/editWithSql")] public async Task<IActionResult> CreateOrEditWithSql(WishlistItem item) { var bucket = await _bucketProvider.GetBucketAsync("demo"); var cluster = bucket.Cluster; var id = item.Id ?? Guid.NewGuid(); var result = await cluster.QueryAsync<WishlistItem>( @"UPSERT INTO demo._default.wishlist (KEY, VALUE) VALUES ($id, { ""name"" : $name });", options => options .Parameter("id", id) .Parameter("name", item.Name) ); return Ok(result); } |
Há dois aspectos importantes a serem destacados sobre esse código:
-
- Ele lida tanto com a criação quanto com a atualização. Se item tiver um ID nulo, esse código pressupõe que um novo item da lista de desejos está sendo criado.
- Parametrização: assim como nos bancos de dados relacionais, o SQL++ pode ser vulnerável a Injeção de SQLportanto, a parametrização é altamente recomendada. Observe que a sintaxe do SQL++ usa $ para indicar parâmetros nomeados (por exemplo $id e $name).
Esse endpoint funcionará. Mas, como foi o caso em Parte 3Se o Couchbase for um banco de dados, não precisaremos usar o SQL++ para interagir com o Couchbase. De fato, critérios muito semelhantes se aplicam à decisão de quando usar valor-chave e quando usar SQL++:
| Caso de uso | Chave-valor? | Por que ou por que não? |
| Criar um novo usuário com a chave "73892" | Sim | Acesso direto |
| Modificar um usuário com a chave "73892" | Sim | Acesso direto |
| Modificar apenas o endereço de e-mail de um usuário com a chave "73892" | Sim | Mesmo que o documento do usuário seja grande, o Couchbase tem um recurso baseado em chave API de subdocumentoque permite que você modifique uma parte do documento. |
| Modificar um grupo de usuários com as chaves "73892", "47212" e "90491" | Sim | Isso pode exigir várias operações de valor-chave, mas ainda assim pode ser mais rápido do que usar um SQL SELECT ... WHERE ... IN consulta. |
| Modificar todos os endereços para usar "OH" em vez de "Ohio" | Não | O estado do usuário é provavelmente um atributo "secundário", não uma chave (vários usuários podem ser de Ohio). Esse é um bom caso de uso para um SQL++ ATUALIZAÇÃO |
Como esse endpoint só precisa adicionar ou alterar um único item da lista de desejos, vamos usar a API de valor-chave.
Escreva um ponto de extremidade CRUD CreateOrEdit
Antes de começarmos a codificar, é aconselhável pensar se CriarOuEditar deve ser um único ponto de extremidade ou dividido em um Criar e um ponto de extremidade Editar endpoint. Para esse aplicativo de lista de desejos muito simples, não há validação, autenticação ou outras preocupações transversais a todo o sistema. No entanto, em um sistema de produção, "adicionar" dados e "atualizar" dados podem muito bem seguir regras comerciais diferentes e exigir permissões diferentes. Nesse caso, talvez você queira dividir as operações em dois endpoints.
Por enquanto, vamos começar com um único ponto de extremidade que usa um "upsert":
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[HttpPost] [Route("api/edit")] public async Task<IActionResult> CreateOrEdit(WishlistItem item) { var bucket = await _bucketProvider.GetBucketAsync("demo"); var collection = await bucket.CollectionAsync("wishlist"); var id = item.Id ?? Guid.NewGuid(); await collection.UpsertAsync(id.ToString(), new { Name = item.Name }); return Ok(new { success = true}); } |
Assim como o ponto de extremidade do SQL++, esse ponto de extremidade examina Id para determinar se isso é uma "criação" ou uma "atualização".
O UpsertAsync A função irá:
-
- Criar um novo documento com id.ToString() como a chave
- Modificar um documento existente com uma chave de id.ToString()
Em ambos os casos, quando esse endpoint terminar de ser executado, você terá um documento JSON como { "name" = "nome do item da lista de desejos"} e um GUID como chave (tecnicamente, todas as chaves no Couchbase são strings, mas sabemos que se trata de uma string GUID).
Observação: Uma diferença sutil entre as duas APIs é que o UPSERT só alterará o único campo (nome), enquanto o método de valor-chave UpsertAsync alterará o documento inteiro (que é apenas nome por enquanto).
ASP.NET CRUD em ação
Inicie seu aplicativo no Visual Studio com CTRL+F5, e você verá alguns novos pontos de extremidade aparecerem na interface do usuário do OpenAPI/Swagger:

Do ponto de vista de um consumidor de API, ambos /api/edit e /api/editWithSql funcionarão da mesma forma. Experimente uma vez deixando a ID em branco para criar um novo item e, em seguida, tente novamente com uma ID conhecida (use /api/getall se você precisar obter uma identificação) e observe o que acontece e o que muda.
Por exemplo, adicionei um novo item "Digital Photo Frame", deixando o ID em branco (meu código .NET gerou "1c3de2e7-70ea-4ee2-803b-425bbf6251cb" para mim), e atualizei o item com o ID de "2dab198b-1836-4409-9bdf-17275a2b2462" para ter o nome de "Skyline Chili 2XL T-Shirt". Aqui estão os resultados, conforme vistos na interface do usuário do Couchbase Capella:

O que vem a seguir?
O projeto ASP.NET Core está conectado ao Couchbase Capella e agora está criando/atualizando ("upserting") dados com valor-chave (recomendado) ou SQL++ (não recomendado para essa situação específica).
Na próxima postagem do blog, completaremos o CRUD com "D" de "delete".
Nesse meio tempo, você deve:
-
- Inscreva-se para um teste gratuito do Capella
- Confira o Couchbase Playground para .NET exemplos que você pode executar diretamente no navegador.